层次结构中有一个循环!“json

时间:2013-06-30 16:53:49

标签: json

我收到一个名为“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;
}

3 个答案:

答案 0 :(得分:2)

您可能正在使用循环引用。 Experience引用EmployeeEmployee引用Experience吗?

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

  1. 删除Employee
  2. 中的Experience引用
  3. 创建一个DTO对象:基本上它是一个新的Employee对象,其属性Experience不会对其进行循环引用 Employee。它将为序列化做好准备。您的 目前的课程保持不变。
  4. 请参阅Martin Fowler,了解DTO的概述:

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

答案 1 :(得分:1)

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

Employee{

      private Collection<Experience> experiences;
}

和经验

Experience
{
 // no reference to Employee
}

答案 2 :(得分:0)

如果您不想从实体中删除引用,则有一种解决方法。 使用,

JSONObject response = new JSONObject();
response.getJsonConfig().
                  setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT)
response.put("empList", employeeList);