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