杰森·迪夫

2020-12-30 08:02:53

diff json有很多工具,但是只有json-diff使得编写程序来处理diff输出变得容易。在本文中,我们将探讨json-diff,如何使用它以及如何编写使用其输出的程序。

json-diff是一个易于使用的CLI工具。它仅需要两个参数:FILE1和FILE2,它们只需要是json文件。

json-diff没有内置漂亮的打印选项,因为jq为我们做到了。

json-diff输出是“差异对象”的数组。每个差异对象都有:

path(必需)-j path是由字符串和数字组成的数组,用于描述差异在json中的位置。字符串用于访问对象值,数字用于访问数组值。

leftValue(可选)-leftValue表示路径中FILE1的值。如果缺少leftValue,则表示该路径的left json中没有值。

rightValue(可选)-rightValue表示路径中FILE2的值。如果rightValue丢失,则表示该路径的right json中没有值。

json-diff对于人类看到差异很有用,但其真正的强大功能是用于计算机。 json-diff之所以大放异彩,是因为它很容易编写处理其输出的程序。这是因为输出:

具有简单,透明的架构-这意味着它易于思考,并且很容易从中提取数据

由于输出是json,因此我们经常可以使用jq处理json-diff的输出。在筛选出预期的故障时,Wicked快速测试中会涉及很多方面。例如,在Wicked快速测试中,因异常而失败的测试将异常存储在具有字符串键" e"的对象中。这样,如果我们想过滤出涉及错误的差异,可以编写一个快速的jq脚本:

更强大的是,此输出是json-diff,因此您可以将许多过滤器组合在一起。假设我们知道第一次测试的更改,并且我们已经手动验证了这些更改是否良好,然后可以添加一行jq来隐藏第一次测试中的所有更改。

尽管我们可以将它们组合成一个jq语句,但是两个jq命令更易读且可复制粘贴。这是我最近使用的一个真实示例:

#!/ usr / bin / env bashjq' map(select(.path | contains([" result&#34 ;," backtest_d"])| not))' | \ jq' map(select(.path | contains([" result&#34 ;," parameters"])| not))' | \ jq' map(select(.path [0]!= 33))' | \ jq' map(select(.path [0]!= 51))' | \ jq

我在最后一行使用了NOOP jq,因此我可以轻松地复制粘贴任何实际的jq行来创建新的过滤器。这些程序不一定是完美的,它们是快速又肮脏的一次性程序。

由于这些只是json过滤器,因此我们也可以用python或其他任何语言编写它们。这相当于过滤掉错误,并且是用python编写的第一个测试

#!/ usr / bin / env python3import jsonimport sysdef t(data):如果d [" path"] [0]!= 0和d [" path&# 34;] [-1]!=" e"] print(json.dumps(t(json.load(sys.stdin)))))

这大部分是锅炉板,重点放在粗线。它完成了繁重的工作。它看起来与jq非常相似,因为核心逻辑完全相同。

当前,用于比较json或任何结构化数据文件的最新技术是使用文本diff(通常是git diff)。文本差异完全有效的事实证明了纯文本的强大功能,但仍然有限。文字差异有两个限制。

文字差异不包含完整的json路径。在文本差异中,您可能需要几行上下文来理解更改。这对于代码来说效果很好,但对于JSON而言,值的路径需要理解更多行,因此不起作用。

文字差异对人类来说很容易阅读,但对计算机来说却很难。某些语言具有diff解析器,例如python,但它们处于测试版。

每个差异都包含一个“路径”字段,该字段包含两个文件之间不同的值的标准路径。

json diff的输出本身就是json。这使得编写处理差异的程序变得轻而易举。稍后我们将了解为什么此功能非常有用。

json-diff(尽管有名称)尤其不在于区分“ json”。关于差异化结构化数据,可以是任何格式。 CSV。 XML。 TOML。 YAML。诀窍是使用csv-to-json之类的工具将文件转换为json。只要您具有将它们转换为json的程序,甚至二进制文件都可以与json-diff比较。

这听起来很难,但确实很容易。例如,要比较yaml文件,只需执行以下操作:

猫old.yaml | yaml-to-json> old.jsoncat new.yaml | yaml-to-json> new.jsonjson-diff old.json new.json#或作为一行json-diff<(yaml-to-json< old.yml)<(yaml-to-json< new.yml)

许多代码库都有配置文件,这些配置文件是结构化数据。也许是yaml或json,都没关系。如果是Yaml,请将其转换为json,然后使用json-diff。

出于代码合理的原因,配置代码正在席卷Devops。它本身就是一个很棒的概念,因此它应有自己的职位,但就我们的目的而言,重要的部分是config-as-code表示系统配置通常存储为结构化数据。结构化数据可以呈现为json,我们可以进行区分。

邪恶的快速测试围绕测试作为碰巧是json的数据。特别是,可以通过将预期的测试结果(expected.json)与实际的测试结果(actual.json)进行比较来查看测试失败。

如果您在安装或使用json-diff时遇到任何问题,只需在Twitter(@canardivore)上发消息给我,我们将竭诚为您服务。 我们已经了解了如何使用json-diff。 我们已经展示了处理输出以适应我们自己的需求是多么容易,无论是jq,python还是我们喜欢的语言。 我们已经了解了为什么可以使用它以及如何轻松安装它。 下周,我们将继续使用我最喜欢的工具之一json-sql进行有关json-toolkit的系列文章。 想象一下,能够通过一个命令将整个数据库转储到json中。 很简约。 如果您不想错过,请点击下面的立即订阅