我有一个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"}}.
我希望杰克逊只解析外部ID,发件人,并保留
content = {"title":"test1","author":"john"},
怎么做?
我在内容变量上尝试了@JsonUnwrapped
,但它不起作用。
答案 0 :(得分:4)
为了使用“嵌入式”JSON字符串,您可以使用JsonNode类。如果您指定Packet
类,请执行以下操作:
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-method。
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...
}