JSON序列化中的自定义对象标识

时间:2014-11-05 15:01:12

标签: java json jackson

将具有循环依赖关系的对象图序列化为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还是自定义序列化程序?

1 个答案:

答案 0 :(得分:0)

是的,我称之为JSOG:https://github.com/jsog/jsog-jackson

协议详情如下:https://github.com/jsog/jsog

Ruby,Python和JavaScript中的其他实现:https://github.com/jsog

然而,Jackson的实现仅序列化(我无法弄清楚如何使反序列化工作)。其他实现已完成。