2016-11-17 3 views
0

Ich rufe eine API mit Retrofit2, die mir eine große und komplizierte Antwort gibt. Das war in Ordnung, da ich nur die Antwort in einen String deserialisieren und dann auf einen aktiven MQ setzen musste. Json Attribute der komplizierten AntwortDeserialize Retrofit2 Antwort in JSON ohne Jackson

Aber jetzt würde Ich mag zwei weitere hinzufügen, so dass es aussieht wie folgt aus:

{ "event": "some event", "link": "some link", "details": {complicated response ...} }

Wie Deserialisieren ich eine Antwort als Json (javax.json .Json), also kann ich darauf als JsonObject mit den neuen Attributen aufbauen, und dann ein String?

Die JacksonConverterFactory zwingt mich, diese komplizierte Antwort in POJOs anzupassen, und das will ich nicht! Gerade jetzt füge ich Strings an die Spitze der Antwort, aber das ist keine ideale Lösung.

+0

Alternativ, wenn es insgesamt eine bessere Lösung gibt, würde ich es gerne hören! – Ella

Antwort

1

Unter der Annahme, dass Ihre große und komplizierte Antwort in einem String input benannt ist, könnten Sie vielleicht wie folgt vorgehen:

JsonReader reader = Json.createReader(new StringReader(input)); 
JsonObject response = reader.readObject(); 

JsonObject queueMessage = 
    Json.createObjectBuilder() 
     .add("event", "some event") 
     .add("link", "some link") 
     .add("details", response) 
     .build(); 

Ein weiterer Ansatz, der Jackson verwendet und zwingt Sie nicht die komplizierte Antwort auf deserialisieren in Eine Struktur von JSON-Objekten besteht darin, die Annotation @JsonRawValue zu verwenden, mit der Sie ein String-Feld so kennzeichnen können, dass es bereits JSON enthält, das während der Serialisierung wörtlich eingefügt werden soll.

Dies ermöglicht Ihnen, etwas zu tun:

public class MQMessage { 
    public String event, link; 

    @JsonRawValue 
    public String details; 
} 


MQMessage message = new MQMessage(); 
message.event = "some event"; 
message.link = "Some link"; 
message.details = input; 

String forMQ = new ObjectMapper().writeValueAsString(message); 

Beachten Sie, dass Jackson jede Prüfung nicht tun, dass details gültig JSON tatsächlich enthält.

+1

Yup das hat funktioniert. Vielen Dank! – Ella

Verwandte Themen