我有一个POJO类,用于在JSON消息和POJO对象之间进行序列化和反序列化,以在Java代码中使用。在POJO类中,有一个名为requestMessage
的字段,其中包含一个JSON字符串。在服务之间发送有效负载时,此字段实际上只是一个字符串。
例如,这是有效载荷的外观:
{
"name": "John Smith",
"status": true,
"requestMessage": "{\"id\": \"some-id\", \"timestamp\": \"2019-11-30\"}"
}
为满足该字段的需要,我在POJO类中创建了一个属性requestMessage
,并将类型设置为JSONObject
,这是org.json
包中的一种类型。我认为这种做法很有意义,因为如果需要在代码中使用它,我可以轻松地以JSONObject
的身份访问信息。我的POJO课上有这样的内容:
public class Message {
private String name;
private boolean status;
private JSONObject requestMessage;
@JsonCreator
public Message(
@JsonProperty("name") String name,
@JsonProperty("status") boolean status,
@JsonProperty("requestMessage") JSONObject requestMessage
) {
this.name = name;
this.status = status;
this.requestMessage = requestMessage;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isStatus() {
return status;
}
public void setStatus(boolean status) {
this.status = status;
}
public JSONObject getRequestMessage() {
return requestMessage;
}
public void setRequestMessage(JSONObject requestMessage) {
this.requestMessage = requestMessage;
}
@Override
public String toString() {
return "Message{" +
"name='" + name + '\'' +
", status=" + status +
", requestMessage=" + requestMessage +
'}';
}
}
但是,似乎杰克逊在发送消息时无法正确地将其转换为字符串。 requestMessage
字段始终作为有效内容中的空{}
对象转换为字符串。
在发送有效载荷时,如何让Jackson正确转换和映射requestMessage
POJO类中的Message
属性作为字符串?
答案 0 :(得分:1)
您需要让Jackson使用其JSONObject
方法来序列化toString
字段,如下所示:
public static class Message {
private String name;
private boolean status;
@JsonSerialize(using=ToStringSerializer.class)
private JSONObject requestMessage;
// ...
}
反序列化之所以有效,是因为Jackson默认使用一个使用String
参数进行反序列化的构造函数。 JSONObject
有一个,因此反序列化了。出于一致性考虑,我曾期望toString
用于序列化,但实际上并没有。我认为背后一定有很好的设计理由。
话虽如此,如果您已经使用杰克逊,我不明白为什么您尝试使用JSONObject
中的json.org
。我会坚持Coderino Javarino的建议,将杰克逊的JSONObject
等同于JsonNode
。