I am trying to use the @JsonIdentityInfo from Jackson 2 as described here.
For testing purposes I created the following two classes:
public class A
{
private B b;
// constructor(s) and getter/setter omitted
}
public class B
{
private A a;
// see above
}
Of course, the naive approach failes:
@Test
public void testJacksonJr() throws Exception
{
A a = new A();
B b = new B(a);
a.setB(b);
String s = JSON.std.asString(a);// throws StackOverflowError
Assert.assertEquals("{\"@id\":1,\"b\":{\"@id\":2,\"a\":1}}", s);
}
Adding @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
to class A and/or class B does not work either.
I was hoping that I could serialize (and later deserialize) a
to something like this: (not too sure about the JSON though)
{
"b": {
"@id": 1,
"a": {
"@id": 2,
"b": 1
}
}
}
How can I do that?
It seems jackson-jr has a subset of Jackson's features.
@JsonIdentityInfo
must not have made the cut.If you can use the full Jackson library, just use a standard
ObjectMapper
with the@JsonIdentityInfo
annotation you suggested in your question and serialize your object. For exampleand then
will generate
where the nested
a
is referring to the root object by its@id
.There are several approaches to solve this circular references or infinite recursion issues. This link explain in details each one. I have solved my issues including @JsonIdentityInfo annotation above each related entity, although @JsonView is more recent and may it's a better solution depending of your scenery.
Or using an IntSequenceGenerator implementation:
In some cases, it can be necessary to annotate the Id Property with @JsonProperty("id")
For example, in my case, this made my application run correctly.