2016-11-17 9 views
0

私は大きく複雑なレスポンスを与えるRetrofit2を使用してAPIを呼び出しています。これはうまくいきました。私がする必要があったのは、レスポンスを直列化してStringに変換し、それをactiveMQに入れたからです。それは次のように見えるようにジャクソンのないJSONにRetrofit2レスポンスをデシリアライズ

しかし、今私は2つ以上を追加したいと思いますJSONは複雑な応答に属性:

私はJSON(javax.jsonとしてレスポンスをデシリアライズするにはどうすればよい

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

.Json)ので、新しい属性を持つJsonObjectとして構築し、次にStringを作成できますか?

JacksonConverterFactoryは、この複雑なレスポンスをPOJOに適合させるため、私はそれをしたくありません!今はレスポンスの先頭に文字列を追加していますが、これは理想的な解決策ではありません。

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(); 

ジャクソンを使用してに複雑な応答をデシリアライズするためにあなたを強制するものではありません別のアプローチを、:あなたの大規模かつ複雑な応答はあなたがおそらく次の操作を行うことができinputという名前の文字列であると仮定すると

+0

また、全体的に優れたソリューションがある場合は、それを聞いてみたいと思います! – Ella

答えて

1

JSONオブジェクトの構造は、@JsonRawValue注釈を使用することです。この注釈を使用すると、JSONがすでに含まれていると見なすことができます。このJSONは、シリアル化中にそのまま挿入する必要があります。

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); 

は、ジャクソンはdetailsが実際に有効なJSONが含まれていることを任意の検証を行いませんので注意してください。

これはあなたのような何かを行うことができます。

+1

これはうまくいきました。ありがとうございました! – Ella

関連する問題