2017-10-04 4 views
-1

Je le JSON suivant:Jackson tableau désérialiser avec un objet vide

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

et les classes POJO correspondantes:

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

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

Je voudrais jackson désérialiser à Beana avec un tableau de BeanBs, la Le premier élément serait juste une instance de BeanB et le second serait une instance de BeanB avec le jeu de propriétés name.

J'ai créé la chaîne originale sérialisation ceci:

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

Voici ma configuration complète pour 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); 

L'erreur que je reçois est la suivante:

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

'" {} "' ou '{}'? –

+0

Que JSON a un tableau de contenu mixte, où premier élément est une chaîne et deuxième élément est un objet. Voulez-vous dire '{" beans ": [{}, {" name ":" Will "}]}}', sans les guillemets autour de {{} '? – Andreas

+1

Quel est le problème ici? Est-ce que 'BeanA beanA = this.objectMapper.readValue (json, BeanA.class)' ne fonctionne pas? –

Répondre

0

Utiliser 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'}]}