2016-11-17 107 views
0

我使用Retrofit2調用一個API,該響應給了我一個大而複雜的響應。這很好,因爲我需要做的只是將響應反序列化爲一個字符串,然後將其放在一個activeMQ上。將序列化Retrofit2響應轉換爲JSON而不使用Jackson

不過,現在我想補充兩個Json的屬性複雜的反應,使它看起來像下面這樣:

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

如何反序列化作爲一個JSON響應(javax.json .Json),那麼我可以使用新屬性將它構建爲JsonObject,然後使用String?

JacksonConverterFactory迫使我將這個複雜的響應納入POJO中,我不想這麼做!現在我正在向響應的頂部添加字符串,但這不是理想的解決方案。

+0

或者,如果總體上有更好的解決方案,我很樂意聽到它! – Ella

回答

1

假設你的大而複雜的反應是在一個名爲input字符串,你也許可以做到以下幾點:

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

另一種方法,它使用傑克遜,並且不強迫你反序列化複雜爲響應JSON對象的結構是使用@JsonRawValue註釋,它允許您將String字段標記爲已包含應該在序列化期間逐字逐句包含的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

相關問題