使用Jackson ObjectMapper反序列化Pojo <t>

时间:2017-04-27 10:01:14

标签: java groovy jackson

我正在尝试使用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#背景,所以这里可能缺少一些东西。

由于

1 个答案:

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

配置说明:

  1. MapperFeature告诉Jackson以不区分大小写的方式匹配字段名称。因此它会找到String Status,尽管它不遵循Java Beans命名约定。在您的情况下这很简洁,但是将String转换为小写会带来很小的性能损失。您也可以使用@JsonProperty注释类中的字段,并指定所需的任何JSON字段名称。
  2. 这告诉Jackson将JSON fiels与Java对象字段相匹配,无论字段可见性privatepublic等等。您还可以使用@JsonAutoDetect注释您的类,并在那里指定可见性。在这两种情况下,您都不需要定义构造函数,但如果您不希望它是公共的,则可以保留它。
  3. 最后一个告诉Jackson在遇到JSON中你班级中不存在的字段时不会失败。在这种情况下"locale"