2017-10-04 190 views
-1

我有以下JSON:杰克逊反序列化阵列与空对象

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

和相应POJO类:

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

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

我想杰克逊反序列化到BeanA与BeanBs的阵列,所述第一个元素将只是BeanB的一个实例,第二个元素将是具有名称属性集的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 ('{}') 
+0

'“{}”'或'{}'? –

+0

JSON有一个混合内容的数组,其中第一个元素是一个字符串,第二个元素是一个对象。你的意思是'{“beans”:[{},{“name”:“Will”}]}',没有'{}'的引号? – Andreas

+1

这里有什么问题? 'BeanA beanA = this.objectMapper.readValue(json,BeanA.class)'不工作吗? –

回答

0

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