jsog-jackson:序列化对象图

时间:2016-03-23 21:28:14

标签: jackson jsog

我正在尝试使用父/子引用来序列化对象图,实际上我有一个看起来像这样的实体:

@Entity (name = "Container")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Container {
    public String type = "parent";

    @JsonManagedReference ("child")
    @OneToMany (mappedBy = "parent", cascade = CascadeType.PERSIST)
    public List<Child> children;
}

@Entity (name = "Child")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Child {
    public String type = "child";

    @JsonBackReference ("child")
    @ManyToOne
    public Parent parent;
}

当我尝试将其序列化到客户端时,这就是我得到的:

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
        },
        { ... }
    ]
}

我在所有对象上看到了@id属性,但没有看到任何@ref属性。如果我已经理解了jsog和jsog-jackson,那么这应该是实际上应该序列化的:

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
            @ref: 1
        },
        { ... }
    ]
}

我真正想要的是在浏览器中恢复序列化的JSOG之后恢复对父级的原始后向引用的方法,这样我就可以获得@ref属性而不是parent属性。每个child对象回来。

1 个答案:

答案 0 :(得分:4)

您使用两种相互冲突的方法来管理循环关系。您可以使用JSOGGenerator OR @JsonManagedReference和@JsonBackReference注释。

JSOGGenerator将以JSON序列化格式包含@id和@ref属性,这对于使用其他语言(如JavaScript)反序列化对象非常有用。

@JsonManagedReference和@JsonBackReference使用Java类信息来标识循环引用,随后该信息被排除在JSON序列化格式之外,因此JavaScript之类的另一种语言无法反序列化该对象,因为缺少所需的信息。

JSOGGenerator的另一个好处是它可以处理深层嵌套的循环关系,而不是有限的父子关系。