2011-03-16 7 views
2

J'essaye de désérialiser un objet JSON provenant d'une application que je ne peux pas contrôler. Voici mon JSON:jackson désérialisation en pojos

{"assembly": 
    {"name":"mm9", 
     "id":32, 
     "chromosomes":[ 
      {"chromosome": 
        {"name":"MT"} 
      }]}} 

Mes POJO, sont

class Assembly{ 
     private String name; 
     private int id; 
     private ArrayList<Chromosome> chromosomes; 
     // getters & setters 
} 
class Chromosome { 
    private String name; 
    //getter/setters 

} 

Mais cela ne fonctionne pas à cause des champs supplémentaires "assemblage" "chromosome" &, donc avec un JSON comme:

{"name":"mm9", 
    "id":32, 
    "chromosomes":[  
      {"name":"MT"} 
       ] }} 

cela fonctionne simplement. Existe-t-il un moyen de modifier la configuration ou quelque chose pour y parvenir sans créer de POJOS plus complexes?

Répondre

1

Le problème est que dans le premier extrait JSON, chromosomes est un dictionnaire (Carte), dont l'une des entrées (chromosome) se produit pour correspondre à votre objet Chromosome.

Une cartographie directe plus précise à une classe Java serait

class Assembly{ 
    ... 
    private Map<String, Chromosome> chromosomes; 
} 

Puisque vous mentionnez que vous ne pouvez pas contrôler le format de la source JSON, vous voudrez peut-être regarder dans custom deserializers, ou en utilisant peut-être streaming support de Jackson plutôt que ObjectMapper pour le mappage direct, si vous n'êtes pas content de changer vos POJO de cette manière. Par ailleurs, il est préférable de faire référence aux collections par leur type d'interface (List) plutôt que par un type de béton (ArrayList). Il est très peu probable que le code qui fait référence à cette classe se soucie réellement de savoir s'il utilise un ArrayList, en se référant simplement à l'interface List, il est donc plus facile d'échanger d'autres implémentations si nécessaire (en principe).

+0

J'ai regardé le désérialiseur et le support de streaming, et je vais créer mon propre analyse syntaxique si je n'ai pas le choix. Je voulais simplement quelque chose de très rapide à utiliser car les clés (assemblage, chromosome) sont le nom de la classe. Quelque chose comme: vous voyez le mot assembly, utilisez donc le constructeur Assembly. Pour la carte, c'est vraiment une liste de chromosomes .. – oyo

Questions connexes