2017-10-15 9 views
1

Considérons le document json suivant:accès à la propriété JSON deux fois

{ 
    "a": { 
    "one": "1", 
    "two": "2" 
    }, 
    "b": { 
    "three": "3", 
    "four": "4", 
    } 
} 

je dois deserizlize au-dessous POJO:

class Root{ 

@JsonAlias({"a","b"}) 
Node1 node1; 

@JsonAlias({"a","b"}) 
Node2 node2; 
} 

class Node1 { 
String one; 
String three; 
} 
class Node2 { 
String two; 
String four; 
} 

Il semble que les noeuds imbriqués (a et b) ne peut être traversé seulement une fois pendant mapper.readValue. Jackson remplit seulement node1 si j'enlève @JsonAlias({"a","b"}) de node2 et seulement node2 si j'enlève @JsonAlias({"a","b"}) de node1.

Si je laisse l'annotaion sur les deux, un seul d'entre eux est rempli.

Cette cartographie est-elle prise en charge? Si non, quelle devrait être la solution de contournement?

J'utilise jackson 2.9.1

Répondre

1

@JsonAlias applique uniquement au champ annoté directement, dans votre cas node1, node2. Jackson ne cherchera pas les champs dans les classes Node1 et Node2. Lors de l'analyse d'un objet de la classe Node1 par exemple, il s'attend à des champs one et three indépendamment de l'alias utilisé et il ne peut pas trouver les deux. Je recommande cet ensemble d'annotations:

class Root { 
    @JsonAlias("a") 
    Node1 node1; 

    @JsonAlias("b") 
    Node2 node2; 
} 

class Node1 { 
    String one; 

    @JsonAlias("two") 
    String three; 
} 

class Node2 { 
    @JsonAlias("three") 
    String two; 

    String four; 
} 

Et puis vous pouvez analyser le doc JSON dans votre question.

+0

Merci, @ manos-nikolaidis, mais mon cas d'utilisation est plus complexe que je l'ai décrit. Je me retrouve avec la transformation [jolt] (https://github.com/bazaarvoice/jolt) au milieu puis je lis l'objet transformé avec jackson dans l'objet Root. Merci encore pour votre réponse. –