13

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

我有 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 数据结构,它可能被视为机密。

4

3 回答 3

13

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. 单击保存。
于 2014-08-19T02:28:42.010 回答
3

Jeremy Simmons 创建了一个更好的文件格式包发布在论坛上:“JsonFileFormat.bcpkg”用于BEYOND COMPARE,不需要安装 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 次查看)

于 2015-08-13T13:24:30.447 回答
1

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

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

https://github.com/danielbchapman/groups

API的使用基本上像->

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

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

长短,你可能想要一个 Set 作为你的数据类型。考虑到您的比较可能很复杂,您需要一组更复杂的方法。

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

于 2012-10-09T03:01:26.370 回答