2016-06-21 35 views
1

Ich versuche, einen Rest-Service mit RestTemplate zu konsumieren. Ich habe Probleme beim Deserialisieren der JSON-Antwort. Ich benutze einen benutzerdefinierten Deserializer und mein JSON hat 3 Knoten, aber es sieht so aus, als ob nur einer den Deserializer erreicht. Unten sind mehr Details.RestTemplate - Jackson Deserializer

Unten ist die Antwort JSON:

{ 
    "Hello": { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    }, 
    "Hello": { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    }, 
    "Hello": { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
} 

ich auf die Antwort der Klasse eines benutzerdefinierten Deserializer bin mit für Attribut Hallo mit @JsonDeserializer.

Wenn ich ein readTree wie unten tun:

JsonNode node = jp.getCodec().readTree(jp); 

es erreicht die deserialize Methode, es sieht aus wie es nur ein Knoten aufweist, wird anstelle von 3 wie unten. Manchmal hat es den ersten Knoten und manchmal den letzten. Was könnte hier schiefgehen?

Vielen Dank im Voraus für diese Frage und helfen aus!

ANTWORT: Wie bereits erwähnt, ist dieser JSON ungültig und daher kann Jackson ihn nicht deserialisieren. Ich musste die Antwort als String bekommen und dann manuell deserialisieren.

Antwort

1

JsonNode ist eine Oberklasse ohne spezifisches Inhaltsverhalten. In Ihrem Beispiel sollten Sie eine ObjectNode erhalten, aber da Ihre Eigenschaften alle denselben Namen haben, bleibt nur eine "Hello" -Eigenschaft übrig. readTree() ist eine generische Methode, die nach Möglichkeit automatisch auf den erforderlichen Rückgabetyp umsetzt.

Wenn Sie wirklich brauchen, diese haben Sie Ihre JSON zu einer Arraystruktur zu bewegen:

// you will get one ArrayNode containing multiple ObjectNode 
[ 
    { 
    "Hello": { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    } 
    }, 
    { 
    "Hello": { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    } 
    }, 
    { 
    "Hello": { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
    } 
] 

oder

// you will get one ObjectNode containing one property with an ArrayNode 
{ 
    "Hello": [ 
    { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    }, 
    { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    }, 
    { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
    ] 
} 
+0

Ich nehme einen Service in Anspruch, der heute in der Produktion existiert und an anderen Orten eingesetzt wird. Kann ich den JSON nach Erhalt der Antwort in ein Array konvertieren? – mandy

+0

Tut mir leid, das wird nie mit Jackson imho funktionieren, da es sich bei ObjectNode um eindeutige Schlüssel handelt. –

+0

Die einzige Möglichkeit, dies zu tun, wäre ein vollständiger benutzerdefinierter Deserializer, ohne Tree-Methoden zu verwenden, sondern stattdessen mit 'getCurrentToken()', 'get ... Value()' und 'nextToken()' zu analysieren. Ein Parse zu einer Liste oder einem Multi-Map-Typ. Wird eine Menge Arbeit sein, könnte aber am Ende arbeiten. –

1

Das ist höchstwahrscheinlich, weil das JSON ungültig ist, können Sie nicht drei Knoten mit demselben Namen haben.

Oder es ist kein Fehler, streng genommen aber nur eines der Elemente namens „Hallo“ für as stated in this answer berücksichtigt werden, was schlecht ist, da json nicht die Reihenfolge der Elemente in einem Objekt garantiert nur die Reihenfolge der Elemente in Listen.

Wenn Sie die Möglichkeit haben, die Antwort zu ändern, würde ich stattdessen ein Array von Objekten erstellen.

{ "Hello": [ { "Hi": "Name1", "Call": "PhoneNumber1" }, { "Hi": "Name2", "Call": "PhoneNumber2" }, { "Hi": "Name3", "Call": "PhoneNumber3" } ] } Dann würden Sie einen JsonNode erhalten, der ein Array von JsonNodes ist, über die Sie iterieren können.

+0

i einen Dienst am raubend, die heute in der Produktion existiert und in anderen wird verwendet setzt. Kann ich den JSON nach Erhalt der Antwort in ein Array konvertieren? – mandy

+0

Vielleicht kann diese Antwort Ihnen helfen: http://stackoverflow.com/questions/27710471/java-json-with-duplicate-keys-to-map-using-jackson, lesen Sie unbedingt die Kommentare dort auch :) –

+0

Danke @Daniel, ich werde versuchen Guava und aktualisieren Sie es hier. – mandy