杰克逊 - 嵌套对象的Bean属性

时间:2015-07-15 02:29:15

标签: java json jackson

我尝试反序列化包含一些标准字段的JSON响应和props的嵌套对象,其中包含子类属性,例如:

{
  "id":"whatever",
  "type":"Foo",
  "props":
  {
    "name":"My Name",
    "whatever":"Whatever"
  }
}

字段idtype是标准字段,因此我有一个基类Base,然后扩展为更具体的类:

public class Base{
  private String id;
  private String type;
}

public class Foo extends Base{
  private String name;
  private String whatever;
}

如何让Jackson读取props对象作为其他字段值的来源?我假设我需要创建一个自定义反序列化程序,但我不确定如何具体完成此任务。

2 个答案:

答案 0 :(得分:0)

如果您尝试将props反序列化为对象属性,则需要向Foo类添加相应的属性。

E.g:

public class Foo extends Base{
  private Bar props;
}

public class Bar {
  String name;
  String something;
  ...getters and setters...
}

然后,您将可以通过bar.getName()bar.getSomething()访问JSON中的嵌套属性。

答案 1 :(得分:0)

Foo的自定义反序列化器:

public class FooDeserializer extends JsonDeserializer<Foo> {

    @Override
    public Foo deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = jp.getCodec().readTree(jp);
        String id = node.get("id").asText();
        String type = node.get("type").asText();
        JsonNode props = node.get("props");
        String name = props.get("name").asText();
        String whatever = props.get("whatever").asText();

        return new Foo(id, type, name, whatever); //you need to create this constructor for Foo
    }
}

主要方法示例:

public static void main(String[] args) throws IOException {
        String json = "{\n" +
                "  \"id\":\"whatever\",\n" +
                "  \"type\":\"Foo\",\n" +
                "  \"props\":\n" +
                "  {\n" +
                "    \"name\":\"My Name\",\n" +
                "    \"whatever\":\"Whatever\"\n" +
                "  }\n" +
                "}";
        ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Foo.class, new FooDeserializer());
        mapper.registerModule(module);

        Foo foo = mapper.readValue(json, Foo.class);
    }

依赖关系:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.4</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.4</version>
</dependency>