2

我收到一个名为“net.sf.json.JSONException:层次结构中有一个循环!”的 JSON 异常。

这是代码

Query q = em.createQuery("SELECT e from employee e ");
List<Employee> employeeList = q.getResultList();
JSONObject response = new JSONObject();
response.put("empList", employeeList);

这是员工实体。它有一对多的关系

public class Employee {
@Id
private String userId;
    @JoinColumn(name = "T_MENTORS_userId", referencedColumnName = "userId")
private Collection<Experience> experience;
}
4

3 回答 3

2

您可能会遇到循环引用。ExperienceEmployeeEmployee指? Experience_

如果是这样,有几个解决方案:

  1. 删除中的Employee引用Experience
  2. 创建一个 DTO 对象:基本上它是一个新Employee对象,其属性Experience不会对 Employee. 它将准备好进行序列化。您当前的课程保持不变。

有关 DTO 的概述,请参阅 Martin Fowler:

http://martinfowler.com/eaaCatalog/dataTransferObject.html

于 2013-06-30T18:20:26.233 回答
1

If you don't want to remove the reference from the entity, there is a workaround. Use,

JSONObject response = new JSONObject();
response.getJsonConfig().
                  setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT)
response.put("empList", employeeList);
于 2015-03-10T08:25:16.210 回答
1

在这种情况下,根据您的业务逻辑,您可以删除其中一个引用,例如:

Employee{

      private Collection<Experience> experiences;
}

和经验

Experience
{
 // no reference to Employee
}
于 2013-06-30T17:30:33.743 回答