2014-11-20 13 views
8

Keineswegs bin ich ein Jackon/JSON-Assistent, die wahrscheinlich aus der folgenden Frage ist, ich laufe in:Nesting mehrere Ebenen von Jackson WRAPPER_OBJECTs

Ich habe 2 mögliche Datenstrukturen ich empfangen werde. Die erste ist amountTransaction genannt:

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

die durch die folgende Java-Objekt dargestellt wird:

@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; 
    ... 
} 

jedoch das amountTransaction Objekt erscheint auch als untergeordnetes Element des paymentTransactionNotification Objekt:

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

..die ich dachte, würde vertreten durch:

@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; 
    ... 
} 

Das Analysieren des JSON mit dem Objekt mengeTransaction funktioniert einwandfrei. Es ist ein ziemlich einfaches Beispiel für ein WRAPPER_OBJECT.

jedoch beim Versuch, die JSON für die paymentTransactionNotification zu analysieren, erhalte ich eine Ausnahme anzeigt, dass es nicht richtig mit dem amountTransaction als Element des paymentTransactionNotification umgehen kann:

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

Irgendwelche Gedanken darüber, wie ich kann dies richtig annotieren, damit mein Code sowohl eigenständige als auch gekapselte MengenTransaction-Objekte korrekt behandeln kann?

+1

Ich denke, Sie sollten zeigen, wie Sie denken, dies sollte zu einem POJO zugeordnet werden - ich bin nicht ganz klar, wie es funktionieren würde, weil Eigenschaften eines POJO Namen haben, und Ihr JSON scheint diesen Teil der Informationen zu fehlen. – StaxMan

Antwort

5

Standardmäßig ist das Umbrechen des Stammknotens in Jackson deaktiviert. Sie können innere Objekte wickeln, aber wenn Sie Root-Knoten wickeln wollen, müssen Sie jackson-Funktion für sie (https://jira.codehaus.org/browse/JACKSON-747) aktivieren:

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

Wenn Sie diese Funktionen aktivieren, damit Sie bereits sagte Jackson das Wurzelelement zu wickeln und Sie don‘ t brauchen @ JsonTypeInfo und @ JsonTypeName mehr. Sie können sie einfach löschen. Aber jetzt müssen Sie den Namen des Root-Knotens anpassen und Sie können @ JsonRootName dafür verwenden. Ihre Klassen sollte wie folgt aussehen:

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

Und

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

Ich habe versucht, und Jackson konvertiert beide JSON-Anfragen wie erwartet.

+0

Ich wollte zu bald sprechen und sagen, dass es noch nicht funktionierte, aber dann wurde mir klar, dass ich vergessen hatte, die Features auf meinem Unit test objectMapper zu setzen. Also ja, das funktioniert perfekt. Nur Notiz ist, dass in Jackson 2.4.0 die Feature-Konstanten ein bisschen geändert haben: 'objectMapper.enable (SerializationFeature.WRAP_ROOT_VALUE); objectMapper.enable (DeserializationFeature.UNWRAP_ROOT_VALUE); ' – uncrase

+0

ich auch ähnlich [Frage] haben (https://stackoverflow.com/questions/48433294/design-pojo-for-nested-levels-of-a-field-and- extract-id-from-the-last-level) in Bezug auf verschachtelte Felder und ich bin verwirrt, wie kann ich verschachtelte POJO-Ebene und extrahieren ID von der letzten Ebene von 'Elternkategorie'? Wollte sehen, ob du mir helfen kannst. – john