更新:我删除了原始代码,因为它只是令人困惑,只需要简化代码。如果你想看到我正在做的更多细节,那就在编辑历史中。
我有一个数据结构,我正试图与杰克逊序列化。该结构中的一个项目是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
注释它,我们会回到第一个结果。