【问题标题】:Jackson json two way object referenceJackson json 双向对象引用
【发布时间】:2018-06-21 19:35:30
【问题描述】:

我有一对像

public class Obj1 {
    public int id;
    public String name;
    public Obj2 obj2;
}

public class Obj2 {
    public int id;
    public String name;
    public List<Obj1> obj1list;
}

我希望能够通过 Jackson 将其转换为 Json。我找到了JsonManagedReferenceJsonBackReference 并对其进行了注释,但是当您这样做时,序列化仅以一种方式起作用。它只会在带有JsonManagedReference 端的类被序列化时显示。

如果我序列化一个“Obj1”,我想查看附加到它的“Obj2”。如果我序列化“Obj2”,我想查看附加到它的“Obj1”列表。

我也尝试过像这样使用 JsonIdentityInfo 注释

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")

这似乎可行,只是它将父对象的“id”值添加到子对象(或列表案例中的每个子对象)中,这有点奇怪。虽然我想我可以忍受它。

有没有办法让它按我的预期运行?

【问题讨论】:

  • 您将两个类都命名为Obj1,您可能打算将第二个类命名为Obj2
  • 是的,对不起...我只是写了一个简化的例子

标签: java jackson


【解决方案1】:

您正在查看@JsonIgnoreProperties,它将提供所需的内容并避免 json 递归。

public class Obj1 {
    public int id;
    public String name;
    @JsonIgnoreProperties("obj1list")
    public Obj2 obj2;
}

public class Obj2 {
    public int id;
    public String name;
    @JsonIgnoreProperties("obj2")
    public List<Obj1> obj1list;
}


更新

我总是更喜欢 @JsonIgnoreProperties 而不是 JsonBackReferenceJsonManagedReference。因为它不仅可以解决问题,而且不会逃避任何数据序列化(这是这里需要的情况)。

我在github 上也有一个示例项目来处理这种情况。查找实体类代码School.javaDistrict.java。如果您想运行测试,它是一个 mvn spring-boot 可执行代码。

从 Javadoc 开始,从 Jackson 2.0 开始,@JsonIgnoreProperties 注释可以应用于类和属性。如果同时使用,实际设置将是所有忽略的联合:也就是说,您只能添加要忽略的属性,不能删除或覆盖。因此,您不能使用 per-property annotation 删除要忽略的属性。


工作原理

当您在属性级别定义 @JsonIgnoreProperties 时,在序列化/反序列化时,它将在引用的属性对象上工作。

所以在这里,当解析 Obj1 时,您要求解析器忽略 obj2obj1list 属性。同样,在解析 Obj2 时,它将忽略 Obj 集合中包含的 obj2 引用。所以你的解析将如下所示:

Obj1 : {
    id : int,
    name : string,
    Obj2 : {
     id : int,
     name : string
     obj1list : //ignored avoids recursion
    }
}

Obj2 : {
    id : int,
    name : string,
    obj1list : [{
     id : int,
     name : string,
     obj2 : //ignored avoids recursion
    },
    {
     id : int,
     name : string
     obj2 : //ignored avoids recursion
    }
    ]
}

【讨论】:

  • 好像是这样,但为什么呢?
猜你喜欢
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
  • 2010-11-16
  • 2022-10-15
  • 2016-07-02
相关资源
最近更新 更多