2013-10-24 11 views
6

Il servizio resto risponde conJackson analizzare JSON con unwraping radice, ma senza possibilità di impostare @JsonRootName

<transaction><trxNumber>1243654</trxNumber><type>INVOICE</type></transaction> 

o in JSON:

{"transaction":{"trxNumber":1243654,"type":"INVOICE"}} 

non ci sono problemi quando uso:

E come classe risultante

@JsonRootName("transaction") 
public class Transaction { 
private String trxNumber; 
private String type; 
//getters and setters 
} 

Ma in realtà dovrei usare la classe Transaction dal jar di terze parti, che è esatto come sopra, ma non ha annotazione @JsonRootName ("transazione").

così finisco con

Could not read JSON: Root name 'transaction' does not match expected ('Transaction') for type... 

C'è qualche modi per forzare Jackson analizzare in classe Transaction senza aggiungere alcun roba alla classe transazione stessa (come ottengo questo file come parte di un barattolo di binario) ?

Ho provato PropertyNamingStrategy personalizzato, ma sembra che debba fare solo con i nomi field e getter/setter, ma non con i nomi delle classi.

Java7, Jackson 2.0.5.

Qualche suggerimento? Grazie.

risposta

5

È possibile farlo con la funzione mixin. È possibile creare semplici classe di interfaccia/astratto come questo:

@JsonRootName("transaction") 
interface TransactionMixIn { 

} 

Ora, è necessario configurare ObjectMapper oggetto:

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 
mapper.addMixInAnnotations(Transaction.class, TransactionMixIn.class); 

E infine si può utilizzare per deserializzare JSON:

mapper.readValue(json, Transaction.class); 

Seconda opzione: è possibile scrivere custom deserializer per la classe Transaction.

+1

Ottimo! grazie mille per la risposta Alla fine abbiamo deciso di andare con l'oggetto TransactionWrapper e mettere @JsonRootName ("transaction") sul suo campo Transaction, ma il tuo suggerimento sembra molto interessante! –

+0

'TransactionWrapper' suona bene. Ci ho pensato anche io. In ogni caso è possibile riutilizzare la funzione mixin per risolvere altri problemi in futuro. –

Problemi correlati