2014-11-20 28 views
8

In nessun modo io sono un mago Jackon/JSON, che è probabilmente evidente dalla seguente problema che sto funzionando in:Nesting più livelli di Jackson WRAPPER_OBJECTs

Ho 2 possibili strutture di dati sto ricevendo. Il primo si chiama amountTransaction:

{ 
    "amountTransaction": { 
    "clientCorrelator":"54321", 
    "endUserId":"tel:+16309700001" 
    } 
} 

che è rappresentata dalla seguente oggetto Java:

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) 
@JsonTypeName(value = "amountTransaction") 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class AmountTransaction { 
    private String clientCorrelator; 
    private String endUserId; 
    ... 
} 

Tuttavia l'oggetto amountTransaction appare anche come elemento secondario dell'oggetto paymentTransactionNotification:

{ 
    "paymentTransactionNotification": { 
    "amountTransaction": { 
     "clientCorrelator": "54321", 
     "endUserId": "tel:+16309700001" 
    } 
    } 
} 

.. che pensavo sarebbe stato rappresentato da:

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) 
@JsonTypeName(value = "paymentTransactionNotification") 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class PaymentTransactionNotification { 
    private AmountTransaction amountTransaction; 
    ... 
} 

L'analisi del JSON con l'oggetto amountTransaction funziona correttamente. È un esempio piuttosto diretto di WRAPPER_OBJECT.

Tuttavia quando si cerca di analizzare il JSON per la paymentTransactionNotification, sto diventando un'eccezione che indica che non può affrontare correttamente con l'amountTransaction come elemento del paymentTransactionNotification:

com.fasterxml.jackson.databind.JsonMappingException: Could not resolve type id 'clientCorrelator' into a subtype of [simple type, class com.sf.oneapi.pojos.AmountTransaction] 

Ogni pensiero su come mi può annotarlo correttamente in modo che il mio codice possa gestire correttamente sia gli oggetti di Transaction sia quelli stand-alone incapsulati?

+1

Penso che dovresti mostrare come pensi che questo dovrebbe mappare su un POJO - Non sono abbastanza chiaro su come funzionerebbe, perché le proprietà di un POJO hanno nomi, e il tuo JSON sembra che manchi quella parte di informazione. – StaxMan

risposta

5

Per impostazione predefinita, il nodo radice wrapping in Jackson è disabilitato. È possibile avvolgere oggetti interni, ma se si vuole avvolgere nodo radice è necessario attivare la funzione di Jackson per esso (https://jira.codehaus.org/browse/JACKSON-747):

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.enable(SerializationConfig.Feature.WRAP_ROOT_VALUE); 
objectMapper.enable(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE); 

Quando abilitato queste caratteristiche che già ha detto Jackson per avvolgere l'elemento radice e si don' t necessario più @JsonTypeInfo e @JsonTypeName. Puoi semplicemente cancellarli. Ma ora devi personalizzare il nome del nodo radice e puoi usare @JsonRootName per questo. Le tue lezioni dovrebbe essere simile a questo:

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonRootName("amountTransaction") 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class AmountTransaction { 
    private String clientCorrelator; 
    private String endUserId; 
............... 
} 

E

@JsonIgnoreProperties(ignoreUnknown = true) 
@JsonRootName("paymentTransactionNotification") 
@JsonInclude(JsonInclude.Include.NON_NULL) 
public class PaymentTransactionNotification { 
    private AmountTransaction amountTransaction; 
............. 
} 

Ho provato e Jackson convertito entrambe le richieste JSON come previsto.

+0

Avrei parlato presto e ho detto che non funzionava ancora, ma poi mi sono reso conto che mi ero dimenticato di impostare le funzioni sul mio oggetto objectMapper. Quindi sì, funziona perfettamente. L'unica nota è che in Jackson 2.4.0 le costanti di funzionalità sono cambiate un po ': 'objectMapper.enable (SerializationFeature.WRAP_ROOT_VALUE); objectMapper.enable (DeserializationFeature.UNWRAP_ROOT_VALUE); ' – uncrase

+0

Ho anche [domanda] simile (https://stackoverflow.com/questions/48433294/design-pojo-for-nested-levels-of-a-field-and- extract-id-from-the-last-level) relativo ai campi nidificati e sono confuso su come posso creare POJO di livello nidificato ed estrarre l'id dall'ultimo livello di 'parentCategory'? Volevo vedere se puoi aiutarmi. – john