我想区分两个JSON文本文件.不幸的是,它们是按任意顺序构造的,所以当它们在语义上相同时我会得到差异.我想使用jq(或其他)以任何类型的完整顺序对它们进行排序,以消除仅因元素排序而产生的差异.
--sort-keys解决了一半问题,但它没有对数组进行排序.
我对jq一无所知,不知道如何编写一个保存所有数据的jq递归过滤器; 任何帮助,将不胜感激.
我意识到逐行'diff'输出不一定是比较两个复杂对象的最佳方式,但在这种情况下我知道这两个文件非常相似(几乎相同)并且逐行差异很好为了我的目的.
使用jq或替代命令行工具来区分JSON文件会回答一个非常相似的问题,但不会打印差异.另外,我想保存排序结果,所以我真正想要的只是一个排序JSON的过滤程序.
我们有一个自定义的CD Pipeline Tool,不幸的是它没有对部署参数进行版本控制。因此,我将它们作为json文件放入Bitbucket存储库中,并根据此CD工具的REST API对其进行了验证。
所以我有2个json数组,它们在结构上是相同的,但是可能包含不同的对象或这些对象中的值。我想对它们进行比较,看看它们是否不同以及有什么不同。
到目前为止,我使用的解决方案是: 使用jq或替代命令行工具来区分JSON文件
所以我把它放在我的代码中:
jq --argjson a "${bb_cfg}" --argjson b "${cd_tool_cfg}" -n 'def post_recurse(f): def r: (f | select(. != null) | r), .; r; def post_recurse: post_recurse(.[]?); ($a | (post_recurse | arrays) |= sort) as $a | ($b | (post_recurse | arrays) |= sort) as $b | $a == $b'
Run Code Online (Sandbox Code Playgroud)
现在,如果它们相同,则为true;如果2个json有差异,则为false,但是我不知道有什么不同。
如果返回错误,我尝试使用此方法:
diff --suppress-common-lines -y <(jq . -S <<< "${bb_cfg}") <(jq . -S <<< "${cd_tool_cfg}")
Run Code Online (Sandbox Code Playgroud)
输入$ bb_cfg:
[{
"key": "IGNORE_VALIDATION_ERROR",
"value": "true",
"tags": []
}, …Run Code Online (Sandbox Code Playgroud)