Java中使用jackson API的复杂递归JSON响应

Java中使用jackson API的复杂递归JSON响应,java,json,jackson,Java,Json,Jackson,我正在使用jackson将java类映射到JSON。如何编写/设计包含递归属性的复杂响应?我不知道我的叶子离树有多深。我可以有一个有1个节点和1个值的树(简单),还有一个有N个节点的树 例如,我们可以 { "glossary_0": { "glossary_1": { "glossary_2": { [...] "glossary_N" : "value" } } } } 谢谢你的建议我在分析

我正在使用jackson将java类映射到JSON。如何编写/设计包含递归属性的复杂响应?我不知道我的叶子离树有多深。我可以有一个有1个节点和1个值的树(简单),还有一个有N个节点的树

例如,我们可以

{
"glossary_0": {
    "glossary_1": {
        "glossary_2": {
           [...]
             "glossary_N" : "value"
       }
     }
   }
}

谢谢你的建议

我在分析你的问题时遇到了一些麻烦,希望我回答的是正确的

如果您使用的是Jackson 2.x,您可以使用
@JsonIdentityInfo
来允许Jackson用自动生成的ID替换重复/递归对象引用(反之亦然)。我建议像这样使用UUID生成器:

@JsonIdentityInfo(generator = ObjectIdGenerators.UUIDGenerator.class, property="@id")
public class MyClass {
  private MyClass c1;
  private MyClass c2;

  //getters and setters here
}
对于以上内容,Jackson可能会生成如下所示的JSON(这些不是有效的UUID,但您知道了):


对于上述内容,您必须编写代码来“重新水化”JSON对象(用实际引用的对象替换ID引用),如果您要将对象发送回服务器,以便JSON将其映射回Java对象,则必须“脱水”该对象。我建议为此使用UUID,因为实际上可以保证,如果您看到一个属性值已经作为
@id
遇到,它实际上是对该对象的引用(而不仅仅是碰巧相同的字符串值)。

Jackson不会递归您的对象图。我的意思是说,根据我的经验,Jackson似乎表明它可以避免序列化已经序列化的对象。否则,您将经常遇到无限递归的问题。我能给你的最好的指导是使用Jackson提供的工具来指导它生成正确的JSON,或者查找如何进行自定义编组并自己进行。
{
  @id: 'abcd-1234-efgh-5678', //randomly generated
  c1: null,
  c2: {
    @id: '9876-efgh-4321-abcd' //randomly generated,
    c1: 'abcd-1234-efgh-5678', //set to the id of the referenced object to prevent infinite recursion
    c2: null
  }
}