【问题标题】:JSON diff of large JSON data, finding some JSON as a subset of another JSON大型 JSON 数据的 JSON 差异,发现一些 JSON 作为另一个 JSON 的子集
【发布时间】:2012-10-09 01:24:15
【问题描述】:

我有一个问题想解决,而不必花费大量手动工作来分析。

我有 2 个 JSON 对象(从不同的 Web 服务 API 或 HTTP 响应返回)。两个 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 对每个参数/属性进行手动分析?

就代码解决方案而言,任何语言都可以。我只需要一个解析器或差异工具来满足我的需求。

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

【问题讨论】:

  • 您知道您可以使用换行符和缩进轻松漂亮地打印 JSON 数据吗?
  • FWIW:JSON 文本的 37 个显示页面远非“巨大”;我不会认为它“大”,而只是“不小”。
  • @user1689607,你如何漂亮地打印 JSON 数据?我不是 ajax/jquery/js Web 开发人员,没有使用最新技术进行 Web 开发,几年前只做过非 ajax 的东西。我现在只是测试应用程序。
  • @Software Monkey,真的。但与人们在谈论或演示 JSON diff 时给出的示例相比,这是巨大的。与 XML 相同。如果人们也提供复杂的大型结构示例,那就太好了。
  • @David:在 JavaScript 环境中,首先将 JSON 解析为 JavaScript 对象,然后使用 indentation 参数对其进行字符串化。 var parsed = JSON.parse(jsonString); jsonString = JSON.stringify(parsed, null, 4); console.log(jsonString); JSON.stringify 的第三个参数允许您设置缩进大小或字符,因此可以很好地打印出换行符和缩进。

标签: javascript json diff


【解决方案1】:

Beyond Compare 效果很好,如果您在其中设置 JSON 文件格式以使用 Python 漂亮地打印 JSON。 Windows 的示例设置:

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

【讨论】:

  • 我必须输入 "c:\Python27\python.exe -m json.tool %s %t" 作为加载路径(后一个变量是 %t 而不是 %s)。跨度>
  • 请注意,如果使用较新的 Python 版本(在我的例子中为 3.7.2),它默认安装在 C:\Users\<user>\AppData\Local\Programs\Python\Python37-32
  • 另请注意,如果您要比较来自两个属性序列不同的来源的 JSON,则可能需要将 --sort-keys 添加到命令行参数。因此,我的 Beyond Compare “加载”设置是:C:\Users\<user>\AppData\Local\Programs\Python\Python37-32\python.exe -m json.tool %s %t --sort-keys
【解决方案2】:

Jeremy Simmons 为 BEYOND COMPARE 创建了一个更好的文件格式包 Posted on forum: "JsonFileFormat.bcpkg",它不需要安装 python 左右。

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

JSON 文件格式

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

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

我已将我的 bcpackage 与我完成的 JSON 文件格式一起附加。

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

道具 实用程序 https://github.com/stedolan 的 Stephen Dolan。

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

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

【讨论】:

  • 嗯...我想知道它适用于哪个版本或确切的安装步骤。在带有 BC4 的 Mac 上。在“工具”>“导入设置”上,选择下载的 pkg 文件,然后下一个屏幕是选择要导入的文件格式,它是空白的,无法继续,除非我选中“删除所有现有文件格式”复选框,但我没有不认为这是个好主意,我停在那里。
  • @David - 我在 BC3 + Windows 8.1 x 64 上使用它。问题是它使用 Windows .exe,所以我不知道如何将它放在 Mac 上。尽管该应用程序的 OSX 版本也存在。您可能想在 Windows 上尝试这个以对其进行测试和/或联系包的作者,了解如何在 Mac 上执行此操作。我的想法是在 Mac 上做同样的事情不应该那么复杂 - 但是,因为我没有,所以我无法为你解决这个问题。
  • @David - 我也发布了一个基于 BC 的 SQLite 解决方案 - 这里:sqa.stackexchange.com/a/14283/13028 - 这个展示了如何在 BC 上配置文件类型。这两个都是用户贡献的 BC 文件扩展名。一个是预包装的,另一个有一个操作方法。让我知道这是否适合你。如果没有,我会在有更多时间时尝试为您提供帮助 PS:同样,我没有 Mac,因此无法确定测试它。
  • Beyond Compare 的问题是它不能很好地匹配内容。我在 BC 之外使用 jq 对两个“目录”进行排序,因此所有键都以相同的顺序出现等,但只有一个键值不同,BC 可能会错位很大一部分。尝试在 BC 中使用 align diff 进行更正是一个 PITA,因为它将重新评估并可能撤消已经完成的其他对齐修复。我在 BC 论坛上问过:scootersoftware.com/vbulletin/forum/beyond-compare-3-discussion/… 但仍然没有找到好的解决方案。
【解决方案3】:

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

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

https://github.com/danielbchapman/groups

API 的使用基本类似 ->

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

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

您可能希望将 Set 作为您的数据类型。考虑到您的比较可能很复杂,您需要一组更复杂的方法。

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

【讨论】:

  • 谢谢,有时间我会看看的,不过不知道是不是我需要的。
猜你喜欢
  • 2020-03-25
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多