2017-04-27 86 views
1

我试图用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#背景,所以这里有一些我可能在这里丢失的东西。

感谢

+0

你可以上传你试图反序列化的一些JSON吗? – 2017-04-27 10:19:07

+0

这就是:{“status”:“success”,“locale”:“sg”,“results”:[{“status”:“pending”}]} –

+0

尝试删除空的构造函数或将其设置为“public '。默认访问器只允许同一个包中的类使用它。 – Henrik

回答

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

解释配置:

  1. 这个MapperFeature告诉杰克逊以不区分大小写的方式匹配字段名称。所以它会发现String Status,虽然它不遵循Java Beans命名约定。在你的情况下,这很整齐,但是对于将字符串转换为小写字符会带来一些小的性能损失。您也可以使用@JsonProperty对类中的字段进行注释,并指定所需的任何JSON字段名称。
  2. 这告诉杰克逊将JSON fiels与Java对象字段匹配,而不管字段可见性如何private,public等。您也可以用@JsonAutoDetect注释您的类,并指定其中的可见性。在这两种情况下,您都不需要定义构造函数,但是如果您不希望它是公共的,则可以保留它。
  3. 最后一个告诉杰克逊在遇到JSON中不存在的字段时不会失败。在这种情况下,"locale"
+0

感谢马诺斯!实际上,在看到您的回复之前,我已将FAIL_ON_UNKNOWN_PROPERTIES设置为false,但不知何故,它并未反映我的更改。我不知道其他的,很好。谢谢 –