java - Jackson 用空对象反序列化数组

标签 java json objectmapper jackson2

我有以下 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 ('{}')

最佳答案

使用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'}]}

关于java - Jackson 用空对象反序列化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46571451/

相关文章:

java - 更简单的 CSV 到 SQL java 文件转换器

java 8流转换复杂 map

java - Java/Scala 的特性级行为测试工具

java - 尽管原始位图是未缩放的,但创建的位图是否已缩放?

java - 将 JSON 对象发布到 HTTP 服务器

jquery - 使用 .val 时,Highchart 不会从隐藏输入加载数据

json - 在 JSON 中建模标识符(唯一 ID)的最佳方法

java - com.fasterxml.jackson.databind.exc.MismatchedInputException : Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token

java - MappingJackson2HttpMessageConverter 在 Spring 4 启动期间多次实例化覆盖(无效)自定义 ObjectMapper 设置

ios - 如何在序列化过程中排除 ObjectMapper 中的字段?