问题标签 [jsonidentityinfo]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
354 浏览

java - 杰克逊的@JsonIdentityInfo 广度优先

我正在使用 Jackson 的 @JsonIdentityInfo 从 JSON 中删除圆形对象。

假设下面是 Java 类 Class A, B, C ,下面是结构,

我的对象是(A)

它将对象更改为

因为 C 具有相同的 id,所以我希望将其实现为广度优先,即第一级应该是删除对象并赋予属性,但深度级别应该这样做,有没有办法像下面这样得到它?

0 投票
0 回答
269 浏览

jackson - JsonIdentityInfo 导致对象被序列化为 Id,然后无法反序列化它们

使用 JsonIdentityInfo 时数组反序列化有问题。序列化正确进行,并且数组包含一些存在循环引用的 Id。但是,我无法弄清楚如何将 id 反序列化为对象。我得到一个包含一些对象和一些字符串的数组。[我使用 UUID 作为 id

数组被序列化为

这里,“cee9d79b-77a9-4b3b-a376-ead1d6347d03”和“a15661e1-b4d4-4145-8db8-4e66ad0e4f81”是LineItemExternal id,在上面的json中已经完全序列化了。[为简洁而删除]

引发错误的代码是

它抛出 ClassCastException 说 String 不能转换为 LineItemExternal。这意味着该数组包含一个对象和两个字符串 [ID]

我需要自定义反序列化器还是可以将对象映射器配置为自动执行此操作?

我之前在disqus上问过这个问题,项目src的链接在下面。

https://github.com/ks1974in/DeserializationTestForJson.git

示例输入 json 位于项目文件夹中的文件 input.json 中。测试用例在包 in.cloudnine.inventory.test 中;它是 TestSerializationAndDeserialization 失败的测试是 testWithFile()

抱歉包含这么多代码。但是之前使用有限代码的测试都成功了。但是,上述测试确实因类转换异常而失败

谢谢,萨加尔

请帮我。

0 投票
0 回答
341 浏览

java - 杰克逊将主列表的序列化优先于嵌套对象?

我有一对多的关系,在序列化父对象列表时,JSON 正是我所需要的。但是,在序列化子对象列表时,由于 Jackson 的 JsonIdentityInfo 注释的工作方式,JSON 很难在我的客户端 javascript/typescript 代码中使用。

发生的情况是列表中的第一个孩子被序列化,但它的父级也是如此 - 其中包括几个后续孩子的列表。因此,当需要序列化列表中的第二个孩子时,Jackson 只需放置其 ID,因为它已经序列化在第一个孩子的父母的孩子列表中。

有没有办法告诉杰克逊在序列化时优先考虑顶级列表?如果有办法告诉杰克逊在深入研究子项目之前对所有顶级项目进行序列化,那将是完美的。这就是我的意思:

我有一个父类:

还有一个子类:

序列化父母列表非常有效:

序列化一个孩子的列表给了我这个:

但我真正想要的是:

0 投票
1 回答
382 浏览

java - 如何用完整对象替换 JsonIdentityInfo 的 id?

我的问题类似于反序列化包含 JsonIdentityInfo 的 JavaScript 中的 Jackson 对象,但我正在使用 Java,并且我正在专门询问 jackson,而不是第 3 方的东西。

我正在将 JSON 从服务器发送到客户端。为了节省我正在使用@JsonIdentityInfo的空间并且客户收到:

但是客户端需要真实/完整的 JSON 表示,因为它正在使用不支持 JsonIdentityInfo 的解析器。杰克逊是否有办法将紧凑表示“中途反序列化”为完整表示?

0 投票
1 回答
225 浏览

java - 强制属性在杰克逊中序列化为身份

我有一堂课

(免责声明,我使用 Kotlin 编写,但我将其翻译成 Java,以便更多人阅读)

我想序列化另一个包含Foos 列表的对象,但我希望序列化中的所有条目fooList都是 ID,而不是对象。想到的一种解决方案是在序列化之前以相反的顺序对它们进行拓扑排序,因为它们形成有向无环图。但这显然不是一个完美的解决方案,所以我想知道是否有注释或其他干净的杰克逊方式来做类似的事情。

编辑:
包含 Foo 列表的类如下所示:

当我Bar从这个 JSON 反序列化一个实例时:

然后我将它序列化回来,我希望输出与输入相同,但它是这样的:

0 投票
0 回答
71 浏览

jackson - 处理杰克逊双向引用的最佳方式

我正在尝试使用 Jackson 为我们的核心组件构建 rest API,但我遇到了一些对象出现此异常的问题:

javax.ws.rs.ProcessingException:com.fasterxml.jackson.databind.JsonMappingException:无限递归(StackOverflowError)

经过搜索,我知道了几种解决方法。例如 https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion

我使用了@JsonIdentityInfo,它对我来说很好用,但问题是什么是更好的方法?

在这篇文章中: Infinite Recursion with Jackson JSON and Hibernate JPA issue

有一种说法需要谨慎使用@JsonIdentityInfo,因为它可能会导致问题:

在这种情况下,您必须小心,因为您可能需要多次读取对象的属性(例如,在包含多个共享同一卖家的产品的产品列表中),并且此注释会阻止您这样做。我建议始终查看 firebug 日志以检查 Json 响应并查看代码中发生了什么。

我也读到了这篇文章:http ://springquay.blogspot.com/2016/01/new-approach-to-solve-json-recursive.html

@JsonIdentityInfo

我知道@JsonIdentityInfo 是 Jackson 2 中的较新方法。

优点是它需要最少的代码更改(只需将此注释放在有问题的对象模型中,而无需从另一端处理它。

缺点说明

@JsonIgnoreProperties 它需要更改更多类,而不仅仅是注释基类,而且我不确定如果我有多个从该对象模型继承的类,它将如何工作。

0 投票
0 回答
154 浏览

java - 具有空属性的 alwaysAsId 为 true 的 JsonIdentityReference 引发空指针异常

我有两个班级PaymentDetailsDTOUserDTO. 我只想序列化present inside的id字段(一个Long)。我正在使用 Jackson 注释 和.UserDTOPaymentDetailsDTO@JsonIdentityInfo@JsonIdentityReference(alwaysAsId = true)

问题是当内部idUserDTOnull时,序列化以空指针异常结束(但id不为null时有效)。

不确定这是否是它应该表现的方式(如果是,为什么)或者我错过了什么。

相反,我期望的是,如果id 为 null,只需编写 null 或不包含键(取决于@JsonInclude注释是否允许 null)。

以下是有问题的代码。

付款详情DTO

用户DTO

这是个例外

0 投票
0 回答
20 浏览

json-deserialization - 使用 jackson 反序列化 json 文件:UnresolvedForwardReference

有人可以帮助我也面临同样的问题并且无法解决。请在此处找到问题详细信息:https ://coderanch.com/t/648289/java/deserialising-json-file-jackson-UnresolvedForwardReference 。

原因:这基本上是JSON解析问题。在这种特殊情况下,问题是由于删除了 json 有效负载中的根模块实体引用。

XYZ 大约有 9 个依赖项,这个 U100 组件持有对 XYZ 的完整 Json 详细信息的引用,而 (XYZ) 的所有其他组件只有 module_id,并且在解析期间用于引用这个根。在这种特殊情况下,用户试图删除该根,后来却出现解析错误。