使用@JsonIdentityInfo的Jackson序列化不会将标识信息添加到没有属性的对象

时间:2013-12-17 07:22:52

标签: java json jackson

更新:我删除了原始代码,因为它只是令人困惑,只需要简化代码。如果你想看到我正在做的更多细节,那就在编辑历史中。

我有一个数据结构,我正试图与杰克逊序列化。该结构中的一个项目是POJO,其存在只是为了促进引用它的不同项之间的通信。因此,重要的是它们具有相同的参考,而不是不同的参考。

问题在于,尽管在类上有适当的@JsonIdentityInfo注释,但不会生成@id属性。如果我向类添加一个序列化属性,那么生成@id属性就好了。但是我没有想要这个对象实际拥有的属性:关键是所有实例都是共享的。尽管对象本身没有属性,我有没有办法强制杰克逊生成id属性?

这是一个简化的测试用例:

public class Test
{
    @JsonTypeInfo(use=JsonTypeInfo.Id.MINIMAL_CLASS, include=JsonTypeInfo.As.PROPERTY)
    @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
    public static class TestObject
    {
    }

    public static void main (String [] args) throws JsonGenerationException, JsonMappingException, IOException
    {
        TestObject testObject = new TestObject ();
        new ObjectMapper ()
            .writerWithDefaultPrettyPrinter ()                      
            .writeValue (System.out, testObject);

    }
}

运行此程序会得到结果:

{
  "@c" : ".Test$TestObject"
}

将TestObject类更改为:

@JsonTypeInfo(use=JsonTypeInfo.Id.MINIMAL_CLASS, include=JsonTypeInfo.As.PROPERTY)
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public static class TestObject
{
    private int testProperty;

    public int getTestProperty ()
    {
        return testProperty;
    }

    public void setTestProperty (int testProperty)
    {
        this.testProperty = testProperty;
    }
}

给出了结果:

{
  "@c" : ".Test$TestObject",
  "@id" : 1,
  "testProperty" : 0
}

这更接近我想要的,但我不希望生成“testProperty”。我怎么摆脱它?如果我只是用@JsonIgnore注释它,我们会回到第一个结果。

1 个答案:

答案 0 :(得分:0)

这是一个bug in Jackson,显然现在已经在git repo中修复了,并且修复程序已安排进入版本2.3.1。