【问题标题】:Jackson deserialize array with empty object杰克逊用空对象反序列化数组
【发布时间】:2018-03-16 05:40:08
【问题描述】:

我有以下 JSON:

{"beans":["{}",{"name":"Will"}]}

以及对应的POJO类:

public class BeanA {
    private BeanB[] beans;
    ...getters/setters
}

public class BeanB {
    private String name;
    ...getters/setters
}

我希望 jackson 使用 BeanB 数组反序列化为 BeanA,第一个元素将只是 BeanB 的一个实例,第二个元素是具有 name 属性集的 BeanB 实例。

我通过序列化创建了原始字符串:

BeanA beanA = new BeanA();
BeanB beanB = new BeanB();
beanB.setName("Will");
beanA.setBeans(new BeanB[] {new BeanB(), beanB});

这是我对 objectMapper 的完整配置:

this.objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
this.objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
this.objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);

我得到的错误是这样的:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `BeanB` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{}')

【问题讨论】:

  • "{}" 或 {}?
  • 那个 JSON 有一个混合内容数组,其中第一个元素是字符串,第二个元素是对象。你的意思是{"beans":[{},{"name":"Will"}]},没有{} 周围的引号?
  • 这里有什么问题? BeanA beanA = this.objectMapper.readValue(json, BeanA.class) 不行吗?
  • 您的问题是什么?假设您将"{}" 更改为{},那么非常简单的readValue() call shown by Luciano van der Veekens 工作正常。
  • 对不起,我意识到有一个拦截器使用 String.valueOf 将 json 的值转换为字符串

标签: java json objectmapper jackson2


【解决方案1】:

使用ObjectMapper#readValue:

BeanA beanA = new BeanA();
BeanB beanB = new BeanB();
beanB.setName("Will");
beanA.setBeans(new BeanB[] {new BeanB(), beanB});

ObjectMapper om = new ObjectMapper();
om.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);
String json = om.writeValueAsString(beanA);
System.out.println(json); 
// output: {"beans":[{},{"name":"Will"}]}

BeanA deserializedBeanA = om.readValue(json, BeanA.class);
System.out.println(deserializedBeanA); 
// output: BeanA{beans=[BeanB{name='null'}, BeanB{name='Will'}]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-11
    • 2014-09-29
    • 2018-12-18
    • 2019-11-15
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多