Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让Jackson将JSONObject转换为有效负载中的字符串?_Java_Json_Spring Boot_Jackson - Fatal编程技术网

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

Java 如何让Jackson将JSONObject转换为有效负载中的字符串?,java,json,spring-boot,jackson,Java,Json,Spring Boot,Jackson,我有一个POJO类,用于在JSON消息和POJO对象之间序列化和反序列化,以便在Java代码中使用。在POJO类中,有一个名为requestMessage的字段,其中包含一个JSON字符串。当有效负载在服务之间发送时,该字段实际上只是一个字符串 例如,这是有效负载的外观: { "name": "John Smith", "status": true, "requestMessage": "{\"id\": \"some-id\", \"timestamp\": \"2019-1

我有一个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 +
                '}';
    }
}
然而,在发送消息时,Jackson似乎无法将其正确转换为字符串。
requestMessage
字段始终作为有效负载中的空
{}
对象转换为字符串


如何让Jackson在发送有效负载时将
Message
POJO类中的
requestMessage
属性正确地转换和映射为字符串?

您需要告诉Jackson使用其
toString
方法序列化
JSONObject
字段,如下所示:

公共静态类消息{
私有字符串名称;
私有布尔状态;
@JsonSerialize(使用=ToStringSerializer.class)
私有JSONObject请求消息;
// ...
}
反序列化正在工作,因为Jackson默认使用一个构造函数,该构造函数接受一个
字符串
参数进行反序列化
JSONObject
有一个,所以它被反序列化了。为了保持一致性,我本来希望在序列化中使用
toString
,但事实并非如此。我想这背后一定有很好的设计理由


尽管如此,我不明白如果您已经在使用Jackson,为什么还要尝试使用
json.org
中的
JSONObject
。我会坚持使用Jackson中的
JSONObject
,我猜是
JsonNode
,正如所建议的那样。

也许可以使用Jackson自己的
com.fasterxml.Jackson.databind.JsonNode
;序列化自己的类型是明智的directly@CoderinoJavarino如果改用
JsonNode
,如何创建
Message
POJO对象?使用
JSONObject
,我可以创建
新的JSONObject(“{\'id\”:“some id\”,“timestamp\”:“2019-11-30\”)
。但是我不能用
JsonNode
实现这一点。创建自定义反序列化程序将其包装到POJO中如何?@Carven use
ObjectMapper
类;为什么不将
requestMessage
声明为
字符串
?您可以使用
Jackson
将其作为JSON对象进行操作。