我正在尝试使用ObjectMapper反序列化到POJO并且我得到了错误:
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#背景,所以这里可能缺少一些东西。
由于
答案 0 :(得分:1)
我建议像这样创建和配置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
告诉Jackson以不区分大小写的方式匹配字段名称。因此它会找到String Status
,尽管它不遵循Java Beans命名约定。在您的情况下这很简洁,但是将String转换为小写会带来很小的性能损失。您也可以使用@JsonProperty
注释类中的字段,并指定所需的任何JSON字段名称。private
,public
等等。您还可以使用@JsonAutoDetect
注释您的类,并在那里指定可见性。在这两种情况下,您都不需要定义构造函数,但如果您不希望它是公共的,则可以保留它。"locale"
。