有没有一种方法来获取`JSON Lines`文件的差异?

时间:2016-02-17 23:37:48

标签: json diff jq

是否有方法获取JSON Lines文件的差异?如果出现混淆,通过" JSON Lines",我的意思是here所描述的格式,它基本上要求每一行都是有效的JSON结构。无论如何,有一个答案here讨论使用jq来区分两个不同的JSON文件。

然而,在那里,问题是想要不考虑列表内排序,而我确实关心那个排序。此外,答案包含jq脚本,只提供真或假的响应,并且不提供完整的差异。理想情况下,我喜欢完全差异。有一个项目调用json-diff可以对JSON文件进行区分,但它只适用于单个JSON实体,而不适用于JSON行。

重申一下,是否有一种方法或类似jq脚本的东西可以为JSON行格式化文件获取差异?

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,以下内容应该可以胜任。我假设您可以访问jq 1.5,其中包括过滤器walk / 1(如果不是这样的话,很容易用下面的文件补充定义,可以在网上找到,例如src / builtin .jq文件),并且你有一个相当现代的Mac或类似Linux的shell。

(1)使用以下两行创建一个名为(假设)jq-diff.jq的文件:

def sortKeys: to_entries | sort | from_entries;
walk( if type == "object" then sortKeys else . end )

(2)假设其中包含JSON实体的两个文件是FILE1和FILE2,则运行以下命令之一,具体取决于您是否要对每个文件中的JSON实体进行排序:

diff <(jq -cf jq-diff.jq FILE1 | sort) <(jq -cf jq-diff.jq FILE2 | sort)

# OR:

diff <(jq -cf jq-diff.jq FILE1) <(jq -cf jq-diff.jq FILE2)

简要说明:

这里jq的作用是对对象中的键进行排序(不对数组进行排序)并以标准方式打印它们,每行一个(由-c选项提供)。

答案 1 :(得分:1)

您可以使用-s标志将换行符分隔的JSON对象粘贴到包含它们的JSON数组中,从而使它们有资格与json-diff进行比较。