【问题标题】:Compare two JSON structures in Java比较Java中的两个JSON结构
【发布时间】:2015-02-16 16:04:25
【问题描述】:

我正在尝试比较 2 个 JSON API 响应的结构,并忽略数据。

尝试使用 Jackson 实现以下代码将 JSON 响应转换为对象,但它没有给我预期的结果

MyObject ob = new ObjectMapper().readValue(jsonOutput, MyObject.class);

比较 2 个 JSON API 响应的结构和忽略数据的最佳方式可能是什么。

【问题讨论】:

  • 结构到底是什么意思?
  • 给定 JSON 的预期结果是什么?
  • 这完全取决于你为什么要比较两个 JSON 对象的结构。这种比较的结果应该表达什么?
  • 那你为什么不使用 JSON Schema?
  • 是的,有;但是你只会得到一半的图片......

标签: java json rest jackson


【解决方案1】:

不确定这是否是您想要的,但您有使用this package 的解决方案。它可以从两个 JSON 中生成差异。

结果将是一个 JSON 补丁(即 RFC 6902)。您可以跟踪对象成员的删除和删除,因为它们始终是 add 或 remove 操作。


EDIT 来自评论(这就是为什么完全指定问题很重要!),看来你想要的是JSON Schema;我也碰巧有使用杰克逊的an implementation...

【讨论】:

  • 这看起来更像我想要的。我会检查一下并在此处更新空间
  • 另一种解决方案是使用实现JSON Pointer的jackson-coreutils遍历JSON,并收集字段差异;但是,如果您想要完整的图片,这将是一个双重步行。
  • 我现在可以使用 O(N2),只要它能让我了解字段差异
【解决方案2】:

鉴于 JSON 的即席性质,这个简单的功能并不容易,具体取决于结构的复杂程度。如果每个 API 只返回一个带有原始值(null、"" 字符串、布尔值或数字)的对象,那么您可以将键收集到排序集中并进行比较。

但是如果 JSON 变得嵌套很深,这会变得越来越复杂。也许您可以为 JSON 编写一个打印机,它只打印没有值和 JSON 结构(对象和数组)排序的字段/键/属性名称。然后你可以把它放到一个字符串中并比较两者。

【讨论】:

  • 如果 JSON 是“深度嵌套”的,递归下降树遍历不会变得更加复杂。
  • @HotLicks:人类大脑理解差异变得更加复杂,例如当子节点在树中移动时。
  • 如果子节点被移动,那么它就不是同一棵树了。
【解决方案3】:

将两个 JSON 字符串解析为地图和列表。然后编写一个递归下降树遍历器来比较每个元素,使用您想要的任何比较标准。 tree walker 的结构本质上与 JSON 序列化程序相同,因此可以从开源序列化程序开始。大概可以用大约 300-500 行代码来完成。

当然,确实需要定义“匹配”的含义。如果一个数组有 5 个元素,另一个有 10 个元素,如果它们都是字符串或数字,很容易说它们“匹配”,但如果它们是对象数组,那么如果你想允许不同的数组计数“匹配”,它就会变得更加混乱”。

【讨论】:

  • 所以在这种情况下,结构的每个元素都是映射中的键,然后将其与另一个映射进行比较。我的理解对吗
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多