Ted*_*Ted 11 java json jackson
另一个问题,但它与此有关: 用Jackson反序列化JSON - 为什么JsonMappingException"没有合适的构造函数"?
这次我得到了一个不同的错误,即Jackson反序列化器抱怨我的类ProtocolContainer中没有"单字符串构造函数/工厂方法".
但是,如果我添加一个单字符串构造函数,如下所示:
public ProtocolContainer(String json) {}
Run Code Online (Sandbox Code Playgroud)
异常确实消失了,但ProtocolContainer我期望在那里的所有"空",即它的所有属性都处于初始状态,而不是根据JSON字符串填充.
这是为什么?
我很确定你不需要单一的String构造函数,如果你这样做,你就不必填充那个构造函数中的属性,对吧?
=)
Ted*_*Ted 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;
}
Run Code Online (Sandbox Code Playgroud)
然后问题解决了.
Sta*_*Man 18
例外情况表明您拥有的JSON值是一个String,类似于:
{ "protocol" : "http" }
Run Code Online (Sandbox Code Playgroud)
或者"双引号JSON":
"\"{\"property\":\"value\"}\"
Run Code Online (Sandbox Code Playgroud)
当试图绑定像:
ProtocolContainer p = mapper.readValue(json, ProtocolContainer.class);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,杰克逊没有要映射的属性,只是一个字符串.在这种情况下,它确实需要自定义反序列化器或创建器方法.Creator方法可以是单字符串参数构造函数,也可以是单字符串参数静态方法:区别在于只能构造函数自动检测(这只是一个实用的快捷方式,因为只能有一个这样的构造函数,但是多个静态方法).
你的解决方案确实有效,只是想我会给出一些关于发生了什么的背景知识.
第二次阅读它似乎更有可能你有双引号(JSON中的JSON):另一件需要考虑的事情就是获得普通的JSON,如果可能的话.但也许这很难做到.
| 归档时间: |
|
| 查看次数: |
39013 次 |
| 最近记录: |