如何让Jackson将有效负载中的JSONObject转换为字符串?

时间:2019-11-24 13:34:51

标签: java json spring-boot jackson

我有一个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属性作为字符串?

1 个答案:

答案 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