2013-07-09 1 views
40

Esiste un modo integrato per serializzare l'id di un figlio solo quando si utilizza Jackson (fasterxml.jackson 2.1.1)? Vogliamo inviare un Order tramite REST che ha un riferimento Person. L'oggetto person tuttavia è piuttosto complesso e potremmo aggiornarlo sul lato server, quindi tutto ciò di cui abbiamo bisogno è la chiave primaria.Come serializzare solo l'ID di un figlio con Jackson

Oppure ho bisogno di un serializzatore personalizzato per questo? O ho bisogno di @JsonIgnore tutte le altre proprietà? Questo impedirà il rinvio dei dati Person quando si richiede un oggetto Order? Non sono ancora sicuro se avrò bisogno di questo, ma mi piacerebbe avere il controllo su di esso, se possibile ...

+0

Potrebbe essere d'aiuto? http://stackoverflow.com/questions/8179986/jackson-change-jsonignore-dynamically – Omertron

risposta

87

Ci sono un paio di modi. Il primo è di usare @JsonIgnoreProperties per rimuovere oggetti di un bambino, in questo modo:

public class Parent { 
    @JsonIgnoreProperties({"name", "description" }) // leave "id" and whatever child has 
    public Child child; // or use for getter or setter 
} 

un'altra possibilità, se l'oggetto bambino è sempre serializzato come id:

public class Child { 
    // use value of this property _instead_ of object 
    @JsonValue 
    public int id; 
} 

e uno più l'approccio è quello di utilizzare @JsonIdentityInfo

public class Parent { 
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
    @JsonIdentityReference(alwaysAsId=true) // otherwise first ref as POJO, others as id 
    public Child child; // or use for getter or setter 

    // if using 'PropertyGenerator', need to have id as property -- not the only choice 
    public int id; 
} 

che potrebbe funzionare anche per la serializzazione e ignorare proprietà diverse da id. Il risultato non verrebbe comunque spostato come Oggetto.

+0

Questo è veramente utile. Grazie. Quando si usa '@JsonIdentityReference (alwaysAsId = true)', Jackson non può Deserializzare indietro, giusto? È possibile ottenere la stessa funzionalità scrivendo Serializzatore/Deserializzatore personalizzato? – miguelcobain

+1

Corretto - se non ci sono ID oggetto da abbinare, Jackson non riesce a capirlo; così tipicamente questa opzione ha senso per il caso d'uso solo serializzato (dove qualcos'altro può rimetterlo insieme se necessario). I serializzatori personalizzati (de) possono fare tutto ciò che vuoi, quindi teoricamente sì. – StaxMan

+1

@StaxMan puoi dirmi come posso usare '@JsonIdentityReference (alwaysAsId = true' ma voglio ottenere Result racchiuso in Object non come un normale attributo – Waqas