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

时间:2015-01-17 11:25:22

标签: 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"}}.

我希望杰克逊只解析外部ID,发件人,并保留

content = {"title":"test1","author":"john"}, 

怎么做?

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

1 个答案:

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