Json字符串部分反序列化到Java对象,并使用jackson嵌入另一个Json字符串
我有一个java对象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
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()
)。