2011-11-07 5 views
1

J'utilise Jackson 1.9.1 de Scala pour marshall objets à JSON. Mon code de triage ressemble à ceci:Comment renommer la clé racine d'un JSON avec Java Jackson?

val mapper = new ObjectMapper() 

mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true) 
mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy()) 

val introspectorPair = new AnnotationIntrospector.Pair(
    new JacksonAnnotationIntrospector(), 
    new JaxbAnnotationIntrospector() 
) 
mapper.getSerializationConfig().withAnnotationIntrospector(introspectorPair) 

val writer = mapper.defaultPrettyPrintingWriter 
writer.writeValueAsString(this) 

Un JSON typique c'est la production ressemble à ceci:

{ 
    "SalesOrder" : { 
    "id" : "3187e7d0-f84f-11e0-be50-0800200c9a66", 
    "total_paid" : 8.99, 
    "created_at" : "2011-05-14T00:00:00.000+0300", 
    "updated_at" : "2011-05-14T00:00:00.000+0300" 
    } 
} 

Ma question est: comment puis-je renommer la clé racine de « SalesOrder » à un plus JavaScript -friendly "sales_order"? Ajouter un JsonProperty override au-dessus de ma définition de classe ne fonctionne pas - probablement parce que la clé de la racine n'est pas strictement une propriété (par conséquent aussi setPropertyNamingStrategy() non appliquée non plus)?

Des conseils sur la façon d'y parvenir avec reconnaissance!

Répondre

4

Vous pouvez utiliser l'annotation JAXB @XmlRootElement (lors de l'utilisation JaxbAnnotationIntrospector, que vous êtes ici), ou Jackson propre @JsonRootName (en org.codehaus.jackson.map.annotate1). Ou, si vous vouliez le faire sans annotations, vous pouvez également sous-classer AnnotationIntrospector et surcharger la méthode findRootName(...) - c'est ce qui détermine le nom à utiliser, généralement à partir des annotations, mais vous pouvez implémenter n'importe quelle logique personnalisée vouloir.

+0

Merci @StaxMan, ça a bien fonctionné. (Je suis allé avec l'option '@ XmlRootElement'). –

Questions connexes