当前位置: 首页 > 知识库问答 >
问题:

Jackson-嵌套对象的Bean属性

单于煌
2023-03-14

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

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

字段< code>id和< code>type是标准的,所以我有一个基类< code>Base,然后扩展一些更具体的类:

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

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

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

共有2个答案

明宜年
2023-03-14

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>
端木兴国
2023-03-14

如果您尝试将 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访问嵌套属性。

 类似资料:
  • 我对对象接口的jackson序列化有问题。 我有课 哪个实现 还有上课 哪个实现 上课 我要和Jackson连载Container得到结果 但事实上我得到了结果 尽管我在映射中指定了点的序列化类型(),但在嵌套对象“point”中具有属性“name”。接口点视图没有方法getName,但结果中存在点的字段“name”。 若我从类容器中的方法getMap中删除注释(),我将得到结果 现在点没有属性"

  • 问题内容: 有人可以提供一个示例或参考,该示例或参考提供一种使用Jackson库将嵌套JAVA对象转换为JSON输出的方法的方法。我没有转换平面JAVA对象的问题。但是,JSON库显示嵌套的对象名称和类型,而不是其子对象。我几乎可以利用此处提供的相同代码http://www.mkyong.com/java/jackson-2-convert- java-object-to-from-json/ 。

  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?

  • 问题内容: 我有一个对象,它可以是任何数量的深度,并且可以具有任何现有属性。例如: 在此我想设置(或覆盖)属性,如下所示: 属性字符串可以具有任何深度,并且值可以是任何类型/事物。 如果属性键已经存在,则不需要合并对象和数组作为值。 前面的示例将产生以下对象: 如何实现这种功能? 问题答案: 此函数使用您指定的参数应添加/更新容器中的数据。请注意,您需要跟踪架构中的哪些元素是容器,哪些是值(字符串

  • 我有一个对象,可以是任何数量的层次深,可以有任何现有的属性。例如: 在此基础上,我希望设置(或覆盖)如下属性: 属性字符串可以有任何深度,值可以是任何类型/事物。 如果属性键已经存在,则不需要合并作为值的对象和数组。 上一个示例将生成以下对象: 如何实现这样的功能?