比较两个 JSON 数组并返回它们的差异。

6
我们有一个自定义的CD Pipeline Tool,不幸的是它没有版本化部署参数。因此,我将这些参数放入Bitbucket Repo作为一个JSON文件,并针对该CD工具的REST API进行验证。
因此,我有2个JSON数组,它们在结构上相同,但可能包含不同的对象或这些对象中的值。我想比较它们,看看它们是否不同以及不同之处在哪里。
到目前为止,我使用了来自此处的解决方案: Using jq or alternative command line tools to diff JSON files 因此,我已经将其放入我的代码中:
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,否则得到 false,但是我不知道两个 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脚本中将这个数据存储到一个变量中,并将其转化为可用的输出。

1个回答

3

您可以使用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": []
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接