【问题标题】:Complex recursive JSON response in Java using jackson API使用jackson API的Java中复杂的递归JSON响应
【发布时间】:2014-02-03 21:03:14
【问题描述】:

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

例如,我们可以有

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

感谢您的建议

【问题讨论】:

  • Jackson 不会递归你的对象图。我的意思是说,根据我的经验,杰克逊似乎表明它将避免序列化它已经序列化的对象。否则,您将不断遇到无限递归的问题。我能给你的最好指导是使用 Jackson 提供的工具来指导它生成正确的 JSON,或者查看如何进行自定义编组并自己做。

标签: java json jackson


【解决方案1】:

我在解析您的问题时遇到了一些问题,所以希望我的回答是正确的。

如果您使用的是 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,但您明白了):

{
  @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
  }
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-28
    • 2022-08-18
    • 2019-08-28
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多