Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在将Java中的3节点引用序列化为JSON时,如何防止无限循环?_Java_Json_Serialization_Jackson - Fatal编程技术网

在将Java中的3节点引用序列化为JSON时,如何防止无限循环?

在将Java中的3节点引用序列化为JSON时,如何防止无限循环?,java,json,serialization,jackson,Java,Json,Serialization,Jackson,在我的SpringMVC应用程序中,我有三个类——Content、Category和Document——它们都是相互关联的,必须序列化为JSON,但这样做会导致无限循环。这种关系是这样的: Content -> List<Category> -> List<Document> -> List<Content> -> (etc.) 内容->列表->列表->列表->(等) 其中Category是内容的属性,等等。我正在尝试序列化它,以便

在我的SpringMVC应用程序中,我有三个类——Content、Category和Document——它们都是相互关联的,必须序列化为JSON,但这样做会导致无限循环。这种关系是这样的:

Content -> List<Category> -> List<Document> -> List<Content> -> (etc.)
内容->列表->列表->列表->(等)
其中Category是内容的属性,等等。我正在尝试序列化它,以便引用在List处结束(以便Content.categories.documents向视图公开),但找不到任何方法。使用Jackson的@JsonManagedReference和@JsonBackReference进行注释将不起作用,因为其中一些字段已经为其他关系进行了注释。除了可能构建特定于相关视图的模型之外,不确定如何进行此操作


编辑:如果这有帮助的话,我得到的错误是“org.springframework.http.converter.HttpMessageNotWritableException:无法写入JSON:无限递归(StackOverflowError)”,后面是引用链的跟踪。

您尝试过使用@JsonIgnore吗?当我在SpringMVC中使用Hibernate时,它工作得更好。

您尝试过转换器吗


使用其他两个类的转换器分别序列化每个类。例如,序列化内容时,为类别和文档编写转换器。转换可以是类别和文档的标识符。当涉及到反序列化时,首先获取对象并记住它们的关系。然后使用标识符重建它们之间的关系

也许可以看看
@JsonIdentityInfo
注释,它可以用于处理循环依赖关系(提到它)?它不适用于
Collection
s(唉),但适用于包含在集合、数组和映射中的POJO。

@JsonManagedReference
@JsonBackReference
在它们可以处理的循环类型方面相当有限。特别是,它们只能用于表示相当静态的父子类型关系。本质上,它们只能用于处理严格树的层次结构。但是在大量的项目中,对象关系实际上是用一个图来表示的,这是前面提到的两个注释无法处理的。Jackson的设计师们意识到了这一点,在2.0版的库中,他们引入了一个

通过这种新机制,您可以使用
@JsonIdentityInfo
注释注释所有三个对象(
Content
Document
Category
),然后Jackson应该能够正确地序列化(和反序列化)它们

简单代码示例:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "someUniquePropertyOfYourClass")
public class Context {
    // fields, constructors, getters/setters
}

无法@JsonIgnore任何字段,因为这些引用在其他视图中是必需的,例如,我在另一个视图中使用document.contents。由于关系的性质,这将变得有点太复杂。如果有更多的时间,我可能会进一步检验这个理论,但业务需要迫使我建立一个新的资源模型。嗯?向3个类添加注释太复杂?如果做得好,它并不复杂,完全是声明性的。