大型 JSON 数据的 JSON diff,找到某些 JSON 作为另一个 JSON 的子集

问题描述 投票:0回答:4

我有一个问题想要解决,而不需要花费大量的手动工作来分析作为替代方案。

我有 2 个 JSON 对象(从不同的 Web 服务 API 或 HTTP 响应返回)。 2 个 JSON 对象之间存在交叉数据,并且它们共享相似的 JSON 结构,但不相同。一个 JSON(较小的一个)就像较大 JSON 对象的子集。

我想找到两个对象之间所有相交的数据。实际上,我对对象内的共享参数/属性更感兴趣,而不是每个对象的参数/属性的实际值。因为我希望最终使用一个 JSON 输出中的数据来构造另一个 JSON 作为 API 调用的输入。不幸的是,我没有为每个 API 定义 JSON 的文档。 :(

让这变得更困难的是 JSON 对象非常庞大。如果通过 Windows 记事本打印出来,则跨越一页。另一本长达 37 页。 API 返回压缩为单行的 JSON 输出。普通文本比较作用不大,我必须手动重新格式化或使用脚本来分解对象和换行符等,以便文本比较能够正常工作。尝试使用 Beyond Compare 工具。

我可以手动搜索/grep,但是循环遍历较小 JSON 中的所有参数是很痛苦的。可以编写代码来做到这一点,但我还必须花时间来做到这一点,并测试代码是否也有效。或者也许已经有一些现成的代码......

或者可以寻找 JSON diff 类型工具。找了一些。遇到这些:

https://github.com/samsonjs/json-diffhttps://tlrobinson.net/projects/javascript-fun/jsondiff

https://github.com/andreyvit/json-diff

两者都没有达到我想要的效果。据推测,JSON 要么太复杂,要么太大而无法处理。

对最佳解决方案有什么想法吗?或者现在最好的解决方案可能是使用 grep 对每个参数/属性进行手动分析?

就代码解决方案而言,任何语言都可以。我只需要一个解析器或 diff 工具来完成我想要的任务。

抱歉,也无法与您分享 JSON 数据结构,它可能被视为机密。

javascript json diff
4个回答
14
投票
如果您在其中设置 JSON 文件格式以使用

Python 漂亮地打印 JSON,则 Beyond Compare 效果很好。 Windows 的示例设置:

  1. 安装Python 2.7。
  2. 在 Beyond Compare 中,转到“工具”下的“文件格式”。
  3. 单击新建。选择文本格式。输入“JSON”作为名称。
  4. 在“常规”选项卡下:
    • 面膜:
      *.json
  5. 在转换选项卡下:
    • 转换:外部程序(Unicode 文件名)
    • 加载中:
      c:\Python27\python.exe -m json.tool %s %t
      • 注意,命令行中的第二个参数必须是
        %t
        ,如果输入两个
        %s
        ,将会导致数据丢失。
  6. 单击“保存”。

3
投票

Jeremy Simmons 创建了一个更好的文件格式包 发布在论坛上:“JsonFileFormat.bcpkg” 用于 BEYOND COMPARE 不需要安装 python 等。

只需下载文件并使用 BC 打开即可。所以,它更简单。

JSON 文件格式

我需要 JSON 文件的文件格式。

我想对我的 JSON 进行漂亮的打印和排序,以便于比较。

我已附上我的 bcpackage 和我完成的 JSON 文件格式。

格式化是通过 jq 完成的 - http://stedolan.github.io/jq/

支持 Stephen Dolan 的实用程序 https://github.com/stedolan.

我已经向 Scooter Software 的人员发送了一条消息,要求他们 将其包含在具有附加格式的页面中。

如果您有兴趣在那里看到它,我肯定会快速回复 具有赞成票的帖子将帮助他们看到发布该帖子的价值。 附加文件 附加文件 文件类型:bcpkg JsonFileFormat.bcpkg (449.8 KB,58 次浏览)


0
投票

我有一个小型 GPL 项目,可以解决 simple JSON 的问题。我没有添加对嵌套实体的支持,因为它更像是一个简单的 ObjectDB 解决方案,而不是实际上的 JSON(尽管事实上它显然是受它启发的。

总而言之,API 非常简单。创建一个新组,填充它,然后通过您需要的任何逻辑参数提取一个子集。

https://github.com/danielbchapman/groups

API的使用方式基本上就像->

SubGroup items = group
                  .notEqual("field", "value")
                  .lessThan("field2", 50); //...etc...

实际上支持基本的联合和连接,这几乎可以满足您的需求。

总而言之,您可能需要一个 Set 作为您的数据类型。考虑到您的比较可能很复杂,您需要一组更复杂的方法。

我唯一要注意的是它是 GPL。如果您的数据是机密的,您可能对该许可证不感兴趣。


0
投票

请参阅 https://eggachecat.github.io/jycm-viewer/ 进行现场演示!

现在它有一个 JS 原生实现。

支持可配置的比较。您可以配置路径列表是有序列表还是集合等。

© www.soinside.com 2019 - 2024. All rights reserved.