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

杰克逊能处理中间关系吗

魏风华
2023-03-14

比如说我有亲子关系。我的父母看起来像

{
   childrens: [...]
}

假设我想要(反)序列化的模型在父对象和子对象之间有一个中间对象。

class Parent {
   Intermediate intermediate
}

class Intermediate {
   Child[] children;
}

我可以将Jackson配置为在将json反序列化到模型中时创建该中间对象,并在序列化回json时同样跳过该中间对象吗?

共有1个答案

戴凯歌
2023-03-14

在这种情况下,您可以使用@JsonUn包装注释。这是一个与您的帖子结构相似的示例

父母亲JAVA

import com.fasterxml.jackson.annotation.JsonUnwrapped;

public class Parent {

    @JsonUnwrapped
    private Intermediate intermediate;

    public Intermediate getIntermediate() {
        return intermediate;
    }

    public void setIntermediate(Intermediate intermediate) {
        this.intermediate = intermediate;
    }
}

中间的JAVA

public class Intermediate {
    private Child[] children;

    public Child[] getChildren() {
        return children;
    }

    public void setChildren(Child[] children) {
        this.children = children;
    }
}

Child.java

public class Child {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

示例文档

{
  "children": [
    {
      "name": "Foo",
      "age": 20
    },
    {
      "name": "Bar",
      "age": 22
    }
  ]  
}

测试驱动程序

ObjectMapper mapper = new ObjectMapper();
Parent parent = mapper.readValue(json, Parent.class);

for (Child child : parent.getIntermediate().getChildren()) {
    System.out.println("Child: " + child.getName() + " is " + child.getAge() + " years old.");
}

产生以下输出:

Child: Foo is 20 years old.
Child: Bar is 22 years old.
 类似资料:
  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 我需要使用Jackson解析器来处理包含非标准单引号而不是双引号的json。以前有人问过这个问题: 配置Jackson以反序列化单引号(无效)JSON 但是“JsonParser”类在杰克逊 2.0 中不再存在。看起来配置对象映射器的较新方法是这样的: 但我找不到ALLOW_SINGLE_QUOTES功能。也许我只是没看到。 如何在Jackson 2.x中反序列化单引号? 编辑 OOPS,没关系。

  • 问题内容: 我的问题很简单:我有以下简单的类: 我正在尝试处理以下JSON: 显然,这里存在一个问题(“ blah”无法解析为int) 以前,Jackson抛出类似org.codehaus.jackson.map.JsonMappingException的内容:无法从字符串值’blah’构造java.lang.Integer的实例:不是有效的Integer值 我同意这一点,但是我想在某个地方注册一

  • 我想知道为什么没有一种坚定的方式来与杰克逊合作。我只想解析JSON字符串: 但我真的很困惑,我应该导入什么来实现这一点。根据这个链接,我尝试导入映射器asl。jar。但我得到了这个编译错误: 然后我尝试导入jackson-core-2.4.2和jackson-databind-2.4.2。所以没有编译错误,但我得到了这个运行时异常(在映射器定义行中): 请指导我应该导入哪些内容才能使用Jackso

  • 问题内容: 在Jersey上使用Jackson 处理器时,何时以及为何需要在两者之间使用注释? 杰克逊(Jackson)还提供了自己的服务提供商以直接使用。这种方法缺少什么?还是为什么我比其他人更喜欢 ps:我也用弹簧 问题答案: 为了生成JSON,通常只需指定即可。但是,这将默认采用JAXB路由。 使用Object-> JAXB-> JSON,您必须注释要映射的类。这可以很好地工作,但是一旦您要

  • 我如何告诉Jackson忽略JSON名称? 我有以下POJO: 当我有这样的东西: “ABCName”:“foo”,然后杰克逊没有认出它抛出错误。 它期望的是: “abcName”:“foo”。 代码: 输出:{"abcname":"Foo"} 然后我试着用@JsonProperty(“ABCName”)注释ABCName 在我注释并运行代码之后,我得到的是:{“ABCName”:“Foo”,“A