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

时间:2011-12-03 16:54:05

标签: java json jackson

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

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

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

public ProtocolContainer(String json) {}

异常确实消失了,但我期望在那里的ProtocolContainer都是“空”,即它的所有属性都处于初始状态,而不是根据JSON字符串填充。

为什么?

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

=)

4 个答案:

答案 0 :(得分: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;
}

然后问题解决了。

答案 1 :(得分:18)

该异常表明您拥有的JSON值是一个String,类似于:

{ "protocol" : "http" }

或者可能是“双引号JSON”:

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

尝试绑定时:

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

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

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

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

答案 2 :(得分:1)

我遇到了同样的问题。对我来说,解决方案是从通过String转换为convertValue方法,转换为InputStream转换为readValue方法:

// 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);

答案 3 :(得分:-1)

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

不是发送要在服务器端解析的字符串,只需发送JSON.parse(stringObject)就可以更轻松地完成,而Jackson会按预期正常反序列化。

相关问题