杰克逊JSON双向对象参考

迈克尔·B:

我有一对像

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”值添加到子对象(或列表案例中的每个子对象)之外,这似乎很有效,这有点奇怪。虽然我想我可以忍受。

有没有办法让它表现出我所期望的?

Amith Kumar:

您正在查看@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;
}


UPDATE

我总是perfers @JsonIgnorePropertiesJsonBackReferenceJsonManagedReference这样做不仅可以实现技巧,而且还可以避免任何数据序列化(此处就是这种情况)。

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

从Javadoc开始,从Jackson 2.0开始,@JsonIgnoreProperties注释既可以应用于类,也可以应用于属性。如果两者都使用,则实际集合将是所有无义对象的并集:也就是说,您只能添加要忽略的属性,而不能删除或覆盖。因此,您不能删除按属性注释要忽略的属性。


它是如何工作

当你定义@JsonIgnoreProperties在欢迎使用属性的水平,而序列化/ deserization它将refered属性对象上工作。

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

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
    }
    ]
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章