我正在编写一个序列化程序来将POJO序列化为JSON,但却陷入循环引用问题.在hibernate双向一对多关系中,父引用子和子引用回父,这里我的序列化器死了.(参见下面的示例代码)
如何打破这个循环?我们可以获取对象的所有者树,以查看对象本身是否存在于其自己的所有者层次结构中的某个位置?任何其他方式来查找引用是否将是循环的?或任何其他想法来解决这个问题?
我有两个实体:
Parent {
Child[] children;
}
and
Child {
Parent parent;
}
Run Code Online (Sandbox Code Playgroud)
我知道@JsonBackReference和@JsonManagedReference.如果我正在序列化实例,那么它们很好Parent.
但我还需要传输实例,Child并希望parent填充该字段.
换一种说法:
Parent它的序列化应该有,children但他们的父字段可能是空的(可以通过使用json引用注释来解决).Child它的序列化应该parent与他们children(但children不必parent填充.有没有办法使用标准的Jackson功能来解决它?
即跳过已经序列化的实体的序列化,而不是标记符合条件或不符合序列化条件的字段.
我正在使用SpringMVC 3.2.4,我希望使用Jackson2将对象序列化为JSON输出.
该对象具有递归属性.如果我尝试使用默认的Jackson ObjectMapper序列化它,我会收到一个递归错误.我意识到我可以@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class)用来防止递归,但是,我实际上希望递归使得在胡子模板中更容易解析.但是,我想限制递归级别.
反正有没有指定杰克逊序列化器只递归1级?如果我需要创建自己的序列化程序,我可以注册它,使其仅用于特定的对象类吗?
正如一些评论所指出的那样,已经存在另一个与此问题非常密切相关的问题:Jackson JSON序列化,通过级别定义来避免递归.然而,在那个问题中,接受的答案(以及其他答案)都表明如何通过使用避免杰克逊的递归@JsonIdentityInfo.在这种特殊情况下,我不打算限制它; 而我想要它.但是,我只想限制递归的深度.
此外,引用的SO问题提供了一些Jackson文档的链接; 我已经有了这些文档,但坦率地说杰克逊的文档非常缺乏.它们指示如何注册序列化程序,但不指示它是如何构造的.也没有任何迹象表明如何确定序列化器的递归级别.最后,没有迹象表明是否/如何在Spring中为Jackson注册序列化程序以应用于特定类型的类.