首页 文章

Jackson 在反序列化时抛出JsonMappingException;要求单串构造函数?

提问于
浏览
11

另一个问题,但它涉及到这个问题:Deserializing JSON with Jackson - Why JsonMappingException "No suitable constructor"?

这次我得到了一个不同的错误,即Jackson反序列化器抱怨我的类ProtocolContainer中没有“单字符串构造函数/工厂方法” .

但是,如果我添加一个单字符串构造函数,如下所示:

public ProtocolContainer(String json) {}

异常确实消失了,但我期望在那里的 ProtocolContainer 是"empty",即它的所有属性都处于初始状态,并且没有根据JSON字符串填充 .

这是为什么?

我很确定你不需要单一的String构造函数,如果你这样做,你就不必填充那个构造函数中的属性,对吧?

=)

4 回答

  • -1

    例外情况表明您拥有的JSON值是一个String,类似于:

    { "protocol" : "http" }
    

    或者“双引号JSON”:

    "\"{\"property\":\"value\"}\"
    

    当试图绑定像:

    ProtocolContainer p = mapper.readValue(json, ProtocolContainer.class);
    

    在这种情况下, Jackson 没有要映射的属性,只是一个字符串 . 在这种情况下,它确实需要自定义反序列化器或创建器方法 . Creator方法可以是单字符串参数构造函数,也可以是单字符串参数静态方法:区别在于只能构造函数自动检测(这只是一个实用的快捷方式,因为只能有一个这样的构造函数,但是多个静态方法) .

    你的解决方案确实有效,只是想我会给出一些关于发生了什么的背景知识 .

    第二次阅读它似乎更有可能你有双引号(JSON中的JSON):另一件需要考虑的事情就是获得普通的JSON,如果可能的话 . 但也许这很难做到 .

  • 1

    我有同样的问题 . 对我来说,解决方案是从传递 String 切换到 convertValue 方法,切换到 InputStreamreadValue 方法:

    // Instead of this:
    String jsonString = "..."
    ProtocolContainer pc = mapper.convertValue(jsonString, ProtocolContainer.class);
    
    // ... do this:
    String jsonString = "..."
    InputStream is = new StringInputStream(jsonString);
    ProtocolContainer pc = mapper.readValue(is, ProtocolContainer.class);
    
  • 18

    您似乎正在向服务器发送字符串而不是对象 .

    您可以通过发送 JSON.parse(stringObject) 来更轻松地发送要在服务器端解析的字符串,而Jackson将按预期正常反序列化 .

  • 19

    哦,所以我在发布这个问题之后再次找到答案(即使我在发布之前尝试过很多东西) .

    我所做的就是使用 @JsonCreator 注释 . 我只是注释了我的静态 Create 方法,如下所示:

    @JsonCreator
    public static ProtocolContainer Create(String jsonString)
    {
    
        ProtocolContainer pc = null;
        try {
            pc = mapper.readValue(jsonString, ProtocolContainer.class);
        } catch (JsonParseException|JsonMappingException|IOException e) {
            // handle
        }
    
        return pc;
    }
    

    然后问题解决了 .

相关问题