比较2个json数组并返回差

不露面

我们有一个自定义的CD管道工具,很遗憾,它不会对部署参数进行版本控制。因此,我将它们作为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'

现在,如果它们相同,则为true;如果2个json有差异,则为false,但是我不知道有什么不同。

如果返回错误,我尝试使用此方法:

diff --suppress-common-lines -y <(jq . -S <<< "${bb_cfg}") <(jq . -S <<< "${cd_tool_cfg}")

输入$ bb_cfg:

[{
    "key": "IGNORE_VALIDATION_ERROR",
    "value": "true",
    "tags": []
},
{
    "key": "BB_CFG_REPO_NAME",
    "value": "cd-tool-cfg",
    "tags": []
}]

输入$ cd_tool_cfg

[{
    "key": "IGNORE_VALIDATION_ERROR",
    "value": "false",
    "tags": []
},
{
    "key": "BB_CFG_REPO_NAME",
    "value": "cd-tool-cfg",
    "tags": []
}]

之所以有效,是因为如果仅值不同,则输出如下所示:

    "value": "true"                       |     "value": "false"

所以我没有在这里得到整个json对象来快速找出什么参数是不同的。

我最终想要得到的是这样的东西:

{
    "key": "IGNORE_VALIDATION_ERROR",
    "value": "true",
    "tags": []
}
{
    "key": "IGNORE_VALIDATION_ERROR",
    "value": "false",
    "tags": []
}

我可以将其存储在bash脚本中的变量中,并在可以使用的输出中对其进行转换。

卡米尔库克

你可以使用jq-c--compact-output选项:

diff <(jq -c .[] <<<"$bb_cfg") <(jq -c .[] <<<"$cd_tool_cfg")
1c1
< {"key":"IGNORE_VALIDATION_ERROR","value":"true","tags":[]}
---
> {"key":"IGNORE_VALIDATION_ERROR","value":"false","tags":[]}

-c选项将简单地在每个行上输出一个json和每个数组成员。

以下命令将为您提供所需的内容:

diff --old-line-format="%L" --unchanged-line-format="" --new-line-format="%L" <(jq -c .[] <<<"$bb_cfg") <(jq -c .[] <<<"$cd_tool_cfg") | jq

将输出:

{
    "key": "IGNORE_VALIDATION_ERROR",
    "value": "true",
    "tags": []
}
{
    "key": "IGNORE_VALIDATION_ERROR",
    "value": "false",
    "tags": []
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章