Json字符串部分反序列化到Java对象,并使用jackson嵌入另一个Json字符串

Json字符串部分反序列化到Java对象,并使用jackson嵌入另一个Json字符串,java,json,jackson,Java,Json,Jackson,我有一个java对象 class packet { int id; String sender; String content; // this is an embedded json string } 这是我的原始json字符串 {"id":0,"sender":"jack","content":{"title":"test1","author":"john"}}. 我希望Jackson只解析外部id、发件人,并保留 content = {"title":"te

我有一个java对象

class packet {
    int id;
    String sender;
    String content;  // this is an embedded json string
} 
这是我的原始json字符串

{"id":0,"sender":"jack","content":{"title":"test1","author":"john"}}.
我希望Jackson只解析外部id、发件人,并保留

content = {"title":"test1","author":"john"}, 
怎么做

我尝试了
@JsonUnwrapped
内容变量,但它不起作用。

为了使用“嵌入式”JSON字符串,可以使用该类。如果您这样指定
数据包
类:

public class Packet {
    private final int id;
    private final String sender;
    private final JsonNode content;  // this is the embedded content

    @JsonCreator
    public Packet(@JsonProperty("id") final int id,
                  @JsonProperty("sender") final String sender,
                  @JsonProperty("content") final JsonNode content) {

        this.id = id;
        this.sender = sender;
        this.content = content;
    }

    public JsonNode getContent() {
        return content;
    }

    public int getId() {
        return id;
    }

    public String getSender() {
        return sender;
    }
}
然后,您可以根据以下内容进行映射:

final String json = "{\"id\":0,\"sender\":\"jack\",\"content\":{\"title\":\"test1\",\"author\":\"john\"}}";
final ObjectMapper mapper = new ObjectMapper();

final Packet packet = mapper.readValue(json, Packet.class);

System.out.println(packet.getContent().toString());
输出将是:

{“标题”:“测试1”,“作者”:“约翰”}

还请注意,
JsonNode
具有方法,因此仍然可以获取内部属性(方法称为
get()
path()

编辑: 在@HotLicks提供了一些输入之后,我还提供了一个简短的代码示例。请注意,这段代码并不遵循例如不可变对象的最佳实践,但它很短。但是,我强烈建议使用不可变对象和适当的构造函数适当地封装POJO,避免字段反序列化,而是使用creator方法

public class Packet {
    @JsonProperty("id")
    private int id;

    @JsonProperty("sender")
    private String sender;

    @JsonProperty("content")
    private JsonNode content;  // this is the embedded content

    // Other methods...
}

将JSON解析为一组映射,然后重新序列化“content”Map.Gad!该解决方案比简单地解析、从结果映射中提取元素“内容”,然后重新序列化要长3倍。@HotLicks,您可能是对的。但是,由于OP已经有了一个POJO,并且希望保持一个字段“原始”,因此只需替换类中的一个成员(内容成员)就可以轻松解决这个问题。请注意,只有POJO发生了变化,我添加了一些“最佳实践”,比如让对象自己不可变。但是,使用嵌套贴图肯定是可能的。这种方法的缺点显然是您失去了所有的类型安全性,您错过了解析错误(例如,如果JSON中存在错误,例如键上的名称错误)等等。@HotLicks,我使用相同的代码提供了一个简短的示例(
JsonNode
)。在我看来,这比处理
Map
更好,因为
JsonNode
提供了一系列处理内容的好方法(例如
path()
)。