2012-03-16 1 views
28

Qual è il modo equivoco nell'annotazione di Jackson Json per le seguenti annotazioni jax-b?Come associare i nomi dei campi JSON a nomi di campi di oggetti diversi?

Ho bisogno di produrre json piuttosto che xml e ho bisogno di conoscere le annotazioni di jackson convenzionali che sono equivalentemente denotate in jax-b.

  1. rinomina un campo.
  2. utilizza i getter invece dei campi.

Queste caratteristiche sono particolarmente cruciale se il nome dell'elemento JSON/XML è una parola java riservata come "new", "public", "static", ecc

In modo che abbiamo di nominare il Campi POJO come "_new_", "_public_", "_static_", ecc, rispettivamente

ma utilizzare l'annotazione jax-b per rinominarli in "nuovo", "pubblico", "statico", ecc. in generato elementi XML (e json).

Rinominare un campo

@XmlAccessorType(XmlAccessType.FIELD) 
public class Person{ 
    @XmlElement(required = true) 
    protected String name; 
    @XmlElement(required = true) 
    protected String address; 
    @XmlElement(name = "contractor") 
    protected boolean _restricted_ ; 
    @XmlElement(name = "new") 
    protected boolean _new_ ; 
} 

Redirect da utilizzando la proprietà getter (credo che questo è il modo si è fatto in JAX-b)

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Person{ 
    protected String name; 
    protected String address; 
    protected boolean _restricted_ ; 
    protected boolean _new_ ; 

    @XmlElement(required = true) 
    protected String getName() {return name;} 
    @XmlElement(required = true) 
    protected String getAddress() {return address;} 
    @XmlElement(name = "contractor") 
    protected boolean getRestricted() {return _restricted_;} 
    @XmlElement(name = "new") 
    protected boolean getNew(){return _new_;} 
} 
+0

fa '@XmlElement (name = "new")' non funzionare per voi? Ho appena provato su un servlet di Jersey (che usa Jackson) e ha funzionato bene. – Danny

+0

Sto usando RestyGWT - Penso che la funzione non sia stata trovata in RestyGWT e quindi ho bisogno di conoscere il jackson equiv prima di provare/proporre di inviare una patch. –

+0

Grazie a @BlessedGeek per il suggerimento. Maggiori informazioni possono essere trovate su http://wiki.fasterxml.com/AnnotationIntrospector Nonostante il metodo nel collegamento sia un po 'vecchio, sto usando questo codice per impostare la priorità del serializzatore/deserializzatore. objectMapper.setAnnotationIntrospector ( nuova AnnotationIntrospectorPair ( nuova JacksonAnnotationIntrospector(), nuova JaxbAnnotationIntrospector() ) ); – aheryan

risposta

69

Probabilmente è un po ' tardi ma comunque ..

è possibile rinominare una proprietà appena aggiungendo

@JsonProperty("contractor") 

E, per impostazione predefinita, Jackson usa getter e setter per serializzare e deserializzare.

Per informazioni più dettagliate: http://wiki.fasterxml.com/JacksonFAQ

+2

Posso utilizzare questa annotazione ** @ JsonProperty ** nella classe Person che ha già annotato con ** @ XmlElement **?Ho provato a sovrascrivere i valori delle proprietà in questo modo: '@JsonProperty (value =" json_Name ") @XmlElement (name =" name_provider ") public String getName() { nome di ritorno; } ma in ogni caso il mio nome è ** name_provider **, non ** json_Name ** – Nikolas

+2

Sì, anche se funziona dipende dalla precedenza di 'AnnotationIntrospector's incluso (Jackson's own vs JAXB). Entrambi saranno rilevati, ma uno registrato con priorità più alta "vince". – StaxMan

+0

Grazie a @StaxMan per il suggerimento. Ho usato la codifica trovata [qui] (http://wiki.fasterxml.com/AnnotationIntrospector) per impostare la priorità – aheryan