2012-08-23 19 views
6

Utilizzando Jackson 2, sto cercando un generico in modo da serializzare gli oggetti come un valore singolo (quindi serializzarli in seguito popolando solo quel singolo campo) senza dover ripetutamente creare un JsonSerializer/JsonDeserializer per gestire ciascun caso. L'annotazione @JsonIdentityInfo è abbastanza vicina, ma manca un po 'il marchio dato che, per quanto posso dire, serializzerà sempre l'intero oggetto figlio alla prima occorrenza.Jackson - serializza/deserializza la proprietà come valore JSON

Ecco un esempio di ciò che voglio fare. Date le classi:

class Customer { 

    Long id = 99; 
    String name = "Joe"; 
    // Lots more properties 
} 

class Order { 
    String orderNum = "11111" 
    @WhateverAnnotationsINeedHereToDoWhatIWant 
    Customer customer; 
} 

Vorrei Ordine di serializzare sia come (o sarebbe perfettamente accettabile per me):

{"orderNum":"11111", "customer":"99"} 
{"orderNum":"11111", "customer":{"id":99}} 

Cosa @JsonIdentityInfo rende più difficile da affrontare sul client -side (possiamo supporre che il cliente sappia come mappare l'ID cliente nelle informazioni complete del cliente).

@JsonIgnoreProperties potrebbe anche essere abbastanza vicino per il secondo JSON mostrato, ma significherebbe che dovrei opt-out di tutto ma quello che voglio.

Al momento della deserializzazione, desidero solo che il cliente venga inizializzato con il campo "id".

Qualunque modo magico di fare ciò che mi manca senza entrare negli interni zuppa di Jackson? Per quanto posso dire, JsonDeserializer/JsonSerializer non ha informazioni contestuali sul genitore quindi non sembra essere un modo semplice per creare un @JsonValueFromProperty ("id") tipo Jackson Mix-in quindi basta guardare quell'annotazione in il Serializzatore/Deserializzatore personalizzato.

Qualsiasi idea sarebbe molto apprezzata. Grazie!

risposta

8

Una volta avevo bisogno di un controllo preciso sul JSON restituito per ogni tipo di richiesta, e temo di aver finito con l'uso di serializzatori e deserializzatori personalizzati.

Una semplice alternativa sarebbe l'aggiunta @JsonIgnore al campo Cliente di Ordine e aggiungere il seguente getter di ordinazione:

@JsonProperty("customer") 
public Long getCustomerId(){ 
    if (customer != null){ 
    return customer.getId(); 
    } 
    else { 
    return null; 
    } 
} 

La restituito JSON sarebbe allora:

{"orderNum":"11111", "customer":"99"} 
+0

Grazie Integrating Stuff! Quella soluzione semplice in realtà sembra abbastanza praticabile per me, e ora sembra orribile;). In assenza di un'annotazione @JsonIgnorePropertiesExcept ("id"), penso che andrà bene. – jonc

4

Un'altra possibilità potrebbe essere utilizzato da @JsonValue, utilizzato sul campo id.

Jackson 2.1 aggiungerà una funzionalità per forzare la serializzazione anche del riferimento di forza come id (di nuova proprietà, "firstAsId" per @JsonIdentityInfo). Potrebbe non funzionare bene con la deserializzazione per tutti i casi, ma forse potrebbe funzionare per te.

+0

Grazie StaxMan. Sfortunatamente @JsonValue non risolve il problema in quanto, se stavo serializzando solo il Cliente da solo, mi aspetterei che il record fosse completamente serializzato. – jonc

+1

Ok. La tua migliore scommessa allora è Jackson 2.1 - consentirà la separazione dei riferimenti (che usano sempre l'id) dalla serializzazione del tipo. – StaxMan

+4

Finalmente per aver provato 2.1 da quando è stato rilasciato in ottobre :)[email protected] (alwaysAsId = true) e @JsonIdentityInfo (generator = "generator = ObjectIdGenerators.PropertyGenerator.class") funziona alla grande dalla fine della serializzazione, ma non così bene quando arriva il momento di deserializzare poiché non può risolvere il riferimento all'ID oggetto . Funzionerebbe con i provider JPA solo per creare un'istanza di un oggetto vuoto e impostare solo l'ID per la deserializzazione, ma non so come potrei essere in grado di forzare il deserializzatore di Jackson per farlo senza definire un deserializzatore personalizzato per ogni possibile tipo di riferimento – jonc

Problemi correlati