gpt4 book ai didi

json - 比较 2 个 json 数组并返回差值

转载 作者:行者123 更新时间:2023-11-29 09:05:48 25 4
gpt4 key购买 nike

我们有一个自定义的 CD 管道工具,不幸的是它没有对部署参数进行版本控制。因此,我将它们作为 json 文件放入 Bitbucket Repo 中,并根据此 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,如果 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": []
}

关于json - 比较 2 个 json 数组并返回差值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55606056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com