【问题标题】:Jackson - Bean Properties from Nested ObjectJackson - 嵌套对象的 Bean 属性
【发布时间】:2015-07-15 02:29:14
【问题描述】:

我正在尝试反序列化一个 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 对象作为进一步字段值的来源?我假设我需要创建一个自定义反序列化器,但我不确定如何具体完成。

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

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

    例如:

    public class Foo extends Base{
      private Bar props;
    }
    
    public class Bar {
      String name;
      String something;
      ...getters and setters...
    }
    

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

    【讨论】:

    • 这实际上是我想要避免的。 props 本身并不是一个对象,而是Foo 属性的容器。基本上我想平展响应,告诉杰克逊它也应该使用props 的属性作为字段值的来源。
    【解决方案2】:

    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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2015-10-25
      • 2017-09-22
      • 1970-01-01
      相关资源
      最近更新 更多