在没有Jackson的情况下将Retrofit2响应反序列化为JSON

时间:2016-11-17 18:55:01

标签: java json jackson deserialization retrofit2

我使用Retrofit2调用API,这给了我一个大而复杂的响应。这很好,因为我需要做的就是将响应反序列化为String,然后将其放在activeMQ上。

但是,现在我想在复杂的响应中再添加两个Json属性,使其如下所示:

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

如何将响应反序列化为Json(javax.json.Json),那么我可以将其构建为具有新属性的JsonObject,然后是String?

JacksonConverterFactory迫使我将这种复杂的反应融入POJO中,我不想这样做!现在我在响应的顶部添加字符串,但这不是一个理想的解决方案。

1 个答案:

答案 0 :(得分: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();

使用Jackson并且不强制您将复杂响应反序列化为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的任何验证。