反序列化使用杰克逊ObjectMapper到POJO的
问题描述:
我试图用ObjectMapper一个POJO反序列化和即时得到错误:反序列化使用杰克逊ObjectMapper到POJO的<T>
No suitable constructor found for type [simple type, class LambdaResult<java.lang.Object>]: can not instantiate from JSON object (missing default constructor or creator, or perhaps need to add/enable type information?)
我的POJO的很简单
class LambdaResult<T> {
LambdaResult() {}
String Status
ArrayList<T> Results
}
而且我反序列化的代码是以下
static <T> T Deserialize(final TypeReference<T> type,
final String json) {
return new ObjectMapper().readValue(json, type)
}
LambdaResult<Object> result = Serialization.Deserialize(new TypeReference<LambdaResult<Object>>() {},jsonResult)
的Json例如:
{"status": "success", "locale": "sg", "results": [{"status": "pending"}]}
我来自C#背景,所以这里有一些我可能在这里丢失的东西。
感谢
答
我会建议创建和配置ObjectMapper
像这样(Java的,对不起,不说话的Groovy):
ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper
在这种情况下,大概应该是在同一个类中的字段作为Deserialize
方法,将随后的样子:
return mapper.readValue(json, type);
解释配置:
- 这个
MapperFeature
告诉杰克逊以不区分大小写的方式匹配字段名称。所以它会发现String Status
,虽然它不遵循Java Beans命名约定。在你的情况下,这很整齐,但是对于将字符串转换为小写字符会带来一些小的性能损失。您也可以使用@JsonProperty
对类中的字段进行注释,并指定所需的任何JSON字段名称。 - 这告诉杰克逊将JSON fiels与Java对象字段匹配,而不管字段可见性如何
private
,public
等。您也可以用@JsonAutoDetect
注释您的类,并指定其中的可见性。在这两种情况下,您都不需要定义构造函数,但是如果您不希望它是公共的,则可以保留它。 - 最后一个告诉杰克逊在遇到JSON中不存在的字段时不会失败。在这种情况下,
"locale"
。
+0
感谢马诺斯!实际上,在看到您的回复之前,我已将FAIL_ON_UNKNOWN_PROPERTIES设置为false,但不知何故,它并未反映我的更改。我不知道其他的,很好。谢谢 –
你可以上传你试图反序列化的一些JSON吗? – 2017-04-27 10:19:07
这就是:{“status”:“success”,“locale”:“sg”,“results”:[{“status”:“pending”}]} –
尝试删除空的构造函数或将其设置为“public '。默认访问器只允许同一个包中的类使用它。 – Henrik