如何解决Hibernate双向映射导致的JSON序列化中的循环引用问题?
如何解决Hibernate双向映射导致的JSON序列化中的循环引用问题?
我正在编写一个序列化器将 POJO 序列化为 JSON,但是卡在了循环引用的问题上。在 Hibernate 双向一对多关系中,父级引用子级,子级又引用回父级,我的序列化器就会挂掉。(请参见下面的示例代码)
如何打破这种循环?我们可以获取对象的所有者树,以查看对象本身是否存在于其自身的所有者层次结构中吗?还有其他方法可以确定参考是否将成为循环吗?还有其他解决此问题的想法吗?
admin 更改状态以发布 2023年5月24日
Jackson 1.6(2010年9月发布)具有特定的注释支持,用于处理此类父/子链接,请参见http://wiki.fasterxml.com/JacksonFeatureBiDirReferences。(Wayback Snapshot)
当然,您可以通过大多数JSON处理包(jackson,gson和flex-json)已经支持的方法来排除父链接的序列化,但是真正的技巧在于如何将其反序列化回来(重新创建父链接),而不仅仅是处理序列化方面。 虽然现在听起来仅仅排除可能对您有效。
编辑(2012年4月):Jackson 2.0现在支持真正的标识引用(Wayback Snapshot),因此您也可以通过这种方式解决它。
我使用Google JSON来处理这种问题,使用该特性
假设A类和B类之间存在双向关系,如下所示
public class A implements Serializable { private B b; }
以及B
public class B implements Serializable { private A a; }
现在使用GsonBuilder获取自定义的Gson对象,如下所示(注意setExclusionStrategies方法)
Gson gson = new GsonBuilder() .setExclusionStrategies(new ExclusionStrategy() { public boolean shouldSkipClass(Class> clazz) { return (clazz == B.class); } /** * Custom field exclusion goes here */ public boolean shouldSkipField(FieldAttributes f) { return false; } }) /** * Use serializeNulls method if you want To serialize null values * By default, Gson does not serialize null values */ .serializeNulls() .create();
现在我们的循环引用
A a = new A(); B b = new B(); a.setB(b); b.setA(a); String json = gson.toJson(a); System.out.println(json);
看看GsonBuilder类