2017-10-04 52 views
-1

で配列をデシリアライズ:ジャクソンは、私は、次のJSONを持って空のオブジェクト

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

と対応するPOJOクラス:

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

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

私はジャクソンがBeanBsの配列でBeanAにデシリアライズしたいと思い、最初の要素はBeanBのインスタンスになり、2番目の要素は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 ('{}') 
+0

'' {} ''または' {} '? –

+0

JSONには混合コンテンツの配列があり、最初の要素は文字列、2番目の要素はオブジェクトです。 {{"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'}]} 
関連する問題