我使用Retrofit2调用API,这给了我一个大而复杂的响应。这很好,因为我需要做的就是将响应反序列化为String,然后将其放在activeMQ上。
但是,现在我想在复杂的响应中再添加两个Json属性,使其如下所示:
{
"event": "some event",
"link": "some link",
"details": {complicated response ...}
}
如何将响应反序列化为Json(javax.json.Json),那么我可以将其构建为具有新属性的JsonObject,然后是String?
JacksonConverterFactory迫使我将这种复杂的反应融入POJO中,我不想这样做!现在我在响应的顶部添加字符串,但这不是一个理想的解决方案。
答案 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的任何验证。