我试图描述使用@JsonIdentityInfo杰克逊2
这里。
为了进行测试,我创建了以下两个类:
public class A
{
private B b;
// constructor(s) and getter/setter omitted
}
public class B
{
private A a;
// see above
}
当然,幼稚的方法会失败:
@Test
public void testJacksonJr() throws Exception
{
A a = new A();
B b = new B(a);
a.setB(b);
String s = JSON.std.asString(a);// throws StackOverflowError
Assert.assertEquals("{\"@id\":1,\"b\":{\"@id\":2,\"a\":1}}", s);
}
添加@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
到A类和/或B类也不起作用。
我希望我可以序列化(然后反序列化)a
为这样的东西:(尽管对JSON不太确定)
{
"b": {
"@id": 1,
"a": {
"@id": 2,
"b": 1
}
}
}
我怎样才能做到这一点?
似乎jackson-jr具有Jackson功能的一部分。@JsonIdentityInfo
一定没有切入。
如果可以使用完整的Jackson库,则只需对问题中建议ObjectMapper
的@JsonIdentityInfo
注释使用标准并序列化对象即可。例如
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class A {/* all that good stuff */}
@JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id")
public class B {/* all that good stuff */}
然后
A a = new A();
B b = new B(a);
a.setB(b);
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(a));
会产生
{
"@id": 1,
"b": {
"@id": 2,
"a": 1
}
}
其中嵌套a
是通过引用根对象@id
。
问题内容: 有时在我的应用程序中打招呼,逻辑迫使我使用循环引用,我想知道如何在春季启用此配置? 问题答案: 看一下这篇文章。 我会从那里的第一个选择中提出建议。循环依赖不是一个好兆头,应该避免。例如,您可以创建第三个辅助类。 其他两个选项是解决方法,以后将很难理解和调试。
我希望我可以序列化(稍后反序列化)为如下所示:(但对JSON不太确定) 我怎么能那样做?
问题内容: 我想在本地保存具有循环引用的对象。我有什么选择? 我的第一个想法是使用HTML5本地存储,但是由于循环引用,我无法对该对象进行字符串化。 具体来说,我正在尝试保存当前选择的DOMSelection对象。 例: 我现在可以使字符串化工作的唯一方法是忽略某些对象,如下所示: 但这给我留下了一个相当空的DOMSelection对象,不足以满足我的需要。 还有其他方法可以保存该对象吗?唯一的要
下面是我的父组件,它包含一个循环的多个输入。如何选择一个来聚焦?在这种情况下,我必须创建动态吗?
问题内容: 有没有我可以用来遍历数组并具有索引和元素的函数,例如Python的枚举? 问题答案: 是。从Swift 3.0开始,如果需要每个元素的索引及其值,则可以使用该方法遍历数组。它返回由索引和数组中每个项目的值组成的对对的序列。例如: 在Swift 3.0之前和Swift 2.0之后,该函数称为: 在Swift 2.0之前,它是全局函数。
问题内容: 我有下表: 存储在其中的实体是按层次结构组织的:如果存在一行,则认为该行是任何内容的“子项” 。由于项目不能从其自身衍生而来,因此我想将存在循环层次序列的行为定为非法: 我该怎么做呢? 另外,我可以在表中添加一个表示层次结构中“级别”的字段: 然后,我要求将其设置为when ,否则。 我正在使用SQL Server 2008 R2。 问题答案: 为了检查循环引用,我使用了触发器和递归C