2011-03-03 6 views
2

J'ai ce problème spécifique avec la désérialisation JSON. Ayons cette structure JSON:Jackson: désérialisation à une collection

{ 
    "header":{ 
    "objects":[ 
     {"field":"value1"}, 
     {"field":"value2"} 
    ] 
    } 
} 

La structure JSON ne peut pas être modifiée car elle provient d'un système tiers.

Maintenant, nous allons avoir ce simple POJO:

@JsonDeserialize(using=PojoDeserializer.class) 
public class Pojo { 
    private string field; 

    //...getter, setter 
} 

Le PojoDeserializer mentionné prend { "champ": "valeur"} chaîne JSON et désérialise à l'instance Pojo. Donc, je peux tout simplement faire la désérialisation comme celui-ci

Pojo instance = new ObjectMapper() readValue ("{\" champ \ ": \" valeur \ "}", Pojo.class);.

Et voici mon problème. Prenons un autre deserializer PojosCollectionDeserializer qui prend la structure mentionnée et la désérialise en une collection d'instances Pojo. Je voudrais l'utiliser de la même manière que dans l'exemple précédent:

Collection<Pojo> pojos = new ObjectMapper().readValue("{...}", Collection.class); 

Mais cela ne fonctionne pas comme il n'y a pas défini cette collection doit être créée en utilisant l'PojosCollectionDeserializer. Y a-t-il un moyen de l'atteindre?

Répondre

2

Je ne sais pas pourquoi tentent de spécifier explicitement désérialiseurs, comme il le ferait tout le travail très bien avec quelque chose comme:

public class Message { 
    public Header header; // or, if you prefer, getter and setter 
} 
public class Header { 
    public List<Pojo> objects; 
} 
public class Pojo { 
    public String field; 
} 

Message msg = objectMapper.readValue(json, Message.class); 

sans configuration supplémentaire ou annotations. Il n'est pas nécessaire de construire des sérialiseurs ou des désérialiseurs personnalisés pour les cas simples comme celui-ci.

+0

Comment Jackson sait-il instancier des instances 'Pojo' pour la collection' List objects; Avec effacement de type d'exécution, je ne suis pas sûr de savoir comment il serait en mesure de le faire. Des idées? –

+1

L'effacement de type n'est pas terminé à 100%: les déclarations de classe conservent les informations de type générique pour les déclarations de méthode et de champ, ainsi que pour les déclarations de sous-type ("extends Xxx"). Le problème se produit lors du passage des objets de classe; il y a juste List.class, et pas de "List .class" grâce à l'effacement du type. – StaxMan

Questions connexes