Java中使用jackson API的复杂递归JSON响应
我正在使用jackson将java类映射到JSON。如何编写/设计包含递归属性的复杂响应?我不知道我的叶子离树有多深。我可以有一个有1个节点和1个值的树(简单),还有一个有N个节点的树 例如,我们可以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" } } } } 谢谢你的建议我在分析
{
"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
}
}