Jackson - serialization of entities with birectional relationships (avoiding cycles)

36,856

Solution 1

Jackson 2.0 does support full cyclic object references. See "Jackson 2.0 released" (section 'Handle Any Object Graphs, even Cyclic ones!') for an example.

Basically, you will need to use new @JsonIdentityInfo for types that require id/idref style handling. In your case this would be both Parent and Child types (if one extends the other, just add it to super type and that's fine).

Solution 2

very handy interface implementation is provided in jackson 2 library as

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Parent { ....

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Child { ....

in maven

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.0.2</version>
</dependency>

@StaxMan provided a nice link to start from

Share:
36,856
Eugene Retunsky
Author by

Eugene Retunsky

Updated on July 09, 2022

Comments

  • Eugene Retunsky
    Eugene Retunsky almost 2 years

    I have two entities:

    Parent {
       Child[] children;
    }
    
    and 
    
    Child {
       Parent parent;
    }
    

    I'm aware about @JsonBackReference and @JsonManagedReference. They are good, if I'm serializing instances of Parent.

    But I also need to transfer instances of Child and I want to have the parent field populated.

    In other words:

    1. On serialization of Parent it should have children but their parent field might be empty (can be solved by using json reference annotations).
    2. On serialization of Child it should have parent with their children (but children don't have to have parent populated.

    Is there a way to solve it using standard Jackson capabilities?

    I.e. skip serialization of entities which were already serialized instead of marking fields eligible or non-eligible for serialization.

  • Eugene Retunsky
    Eugene Retunsky about 12 years
    Pretty fresh release. Requires some package moving. OK, I'll check it out.
  • StaxMan
    StaxMan about 12 years
    Yeah, it is, big upgrade. But feature itself is big too. :-)
  • f.khantsis
    f.khantsis about 12 years
    How do you deserialize using JSON2 in JavaScript?
  • StaxMan
    StaxMan about 12 years
    Sorry -- Jackson 2.0 is just version of library; result is just regular JSON. But as to how to resolve references, for that you would need a matching javascript library: JSON format does not have anything to explicitly help in resolving deps.
  • Mab
    Mab over 8 years
  • raikumardipak
    raikumardipak about 8 years
    I have a similar problem but with no luck after trying this solution :stackoverflow.com/q/36809325/3300911
  • raikumardipak
    raikumardipak about 8 years
    Any idea plz on eat cud b the problem
  • Oleg Abrazhaev
    Oleg Abrazhaev almost 8 years
    doesn't helped with hibernate mapping
  • Oleg Abrazhaev
    Oleg Abrazhaev almost 8 years
    doesn't help with hibernate mapping
  • Oleksii Kyslytsyn
    Oleksii Kyslytsyn over 7 years
  • Krish
    Krish over 6 years
    @StaxMan it will create IDs if the pojo already exists. How to avoid it ? I have created one issue regarding that. can you please help ?stackoverflow.com/questions/47078057/…
  • Carsten Flokstra
    Carsten Flokstra over 4 years
    You rock! Searched the internet for this problem. Finally found a solution. Big thanks!
  • Harsh
    Harsh about 4 years
    This solution worked perfectly for me for Spring Data MongoDB DBRef Two way referencing. Thanks!!
  • fernandopcg
    fernandopcg about 2 years
    This is a solid answer, just want to add to be careful if using Lombok! Add "@EqualsAndHashCode(exclude = {"fieldInRelationship"})" to both classes or those annotations will be ignored as was happening in my case!