将具有循环依赖关系的对象图序列化为JSON时,您需要以某种方式处理它以防止JSON无限大。 Jackson提供了跟踪对象身份的功能,并在第二次序列化对象后立即使用引用,例如参见here.
考虑正在序列化的以下类的列表
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class FooBar
{
public String foo;
}
如果列表中多次出现相同的对象,则会生成以下序列化的JSON字符串
[
{
"@id": 1,
"foo":"bar"
},
{
"@id": 2,
"foo":"baz"
},
1 //reference to the object with @id = 1
]
当您处于一个强大的类型环境中,您知道要从此JSON反序列化的对象的结构时,这不是问题。但是,如果您不知道结构,则存在一个问题,即您不知道哪些项是引用,哪些是简单的整数,对吧?
现在,一个非常简单的解决方案是让JSON看起来像这样:
[
{
"@id": 1,
"foo":"bar"
},
{
"@id": 2,
"foo":"baz"
},
{
"@ref":1
}
]
通过这种方式,您可以简单地浏览整个对象图并检查每个对象是否有成员@ref
,如果是,则将其替换为相应的对象。
我想生成看起来像第二个例子的JSON。有没有人这样做过?如果没有,正确的起点是自定义ObjectIdGenerator还是自定义序列化程序?
答案 0 :(得分:0)
是的,我称之为JSOG:https://github.com/jsog/jsog-jackson
协议详情如下:https://github.com/jsog/jsog
Ruby,Python和JavaScript中的其他实现:https://github.com/jsog
然而,Jackson的实现仅序列化(我无法弄清楚如何使反序列化工作)。其他实现已完成。