2011-03-17 28 views
8

我想将POJO序列化为JSON,但陷入循环引用问题。我知道如何处理一对多和反向关系,使用@JsonBackReference@JsonManagedReference如何解决json串行器中的循环引用引起的Many to Hibernate双向映射?

我的问题是双向多对多关系(例如,学生可以有很多课程,每门课程可以有很多学生注册),家长引用孩子和孩子引用回到父母,在这里我的序列化器死亡。按我的理解,我不能使用@JsonBackReference这里作为属性的值类型必须是一个bean:它不能是一个集合,映射,数组或枚举。

有人请告诉我如何处理这种情况?

回答

8

您可以在关系的两侧中的一侧(注释是类级)使用@JsonIgnoreProperties("someField")。或@JsonIgnore

+0

这一点,此外还有一些附加下面我将提到,解决了类似的问题,很好地适合我。 – jpitt42 2013-11-11 20:28:05

-1

,如果你有集合对象让它成为

collection<object> listobj 

var jsonObj = from c in listobj 
        select new 
       { 
        Prop1 = c.Prop1 
        ... 
       } 

这应该工作和对象,你现在得到可JSON序列及其清洁

+0

.NET/LINQ解决方案在Java/Spring中不起作用 – wrschneider 2011-12-07 17:56:12

0

您还可以使用推土机映射转换POJO映射到排除字段。例如,如果我们有两个类PojoA和PojoB有双向关系,我们这样定义

<mapping map-id="mapA" map-null="false"> 
    <class-a>com.example.PojoA</class-a> 
    <class-b>java.util.Map</class-b> 
    <field> 
    <a>fieldA</a> 
    <b>this</b> 
    </field> 
    <field map-id="mapB"> 
     <a>pojoB</a> 
     <b>this</b> 
     <b-hint>java.util.Map</b-hint> 
    </field> 
</mapping> 

<mapping map-id="mapB" map-null="false"> 
    <class-a>com.example.PojoB</class-a> 
    <class-b>java.util.Map</class-b> 
    <field-exclude> 
    <a>pojoA</a> 
    <b>this</b> 
    </field-exclude> 
</mapping> 

映射然后定义一个bean设置上述推土机映射文件的属性。

<bean id="mapper" class="org.dozer.DozerBeanMapper"> 
    <property name="mappingFiles"> 
    <list> 
     <value>dozerMapping.xml</value> 
    </list> 
    </property> 
</bean> 

然后在类,你在哪里序列化

public class TestClass 
{ 
    @Autowired 
    DozerBeanMapper mapper; 

    public Map<String,Object> serializeObject(PojoA pojoA) 
    { 
      return ((Map<String, Object>) mapper.map(pojoA, Map.class, "mapA")); 
    } 
} 

Dozer manual here

0

简释什么@Bozho已经提到...

我坚持与杰克逊1,因为现在我使用的是谷歌的云终端,所以这仍然可能帮助一些人,即使杰克逊2已经出来了一段时间。即使我不需要整个对象反序列化,但引用仍然是非常必要的。

我把@JsonIgnore上造成循环引用的领域,但随后创建了一个新的getter为每一个使平坦的基准是我的API还是回来了。

@JsonIgnore 
private FooClass foo; 

public String getFooKey() 
... 

云端点,这导致平坦“fooKey”的GET有效载荷被返回,而省略“foo”的。

1

由于@Bozho回答使用@JsonIgnoreProperties,试试这个,它为我工作。

下面是我的模型与@JsonIgnoreProperties:

@Entity 
public class Employee implements Serializable{ 
    @ManyToMany(fetch=`enter code here`FetchType.LAZY) 
    @JoinTable(name="edm_emp_dept_mappg", 
     joinColumns={@JoinColumn(name="emp_id", referencedColumnName="id")}, 
     inverseJoinColumns={@JoinColumn(name="dept_id", referencedColumnName="id")}) 
    @JsonIgnoreProperties(value="employee") 
    Set<Department> department = new HashSet<Department>(); 
} 


@Entity 
public class Department implements Serializable { 
    @ManyToMany(fetch=FetchType.LAZY, mappedBy="department") 
    @JsonIgnoreProperties(value="department") 
    Set<Employee> employee = new HashSet<Employee>(); 
} 

在@JsonIgnoreProperties的价值属性,我们需要提供计数器的集合类型属性(相关的)模型。