首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >比较两个json数组并返回差值

比较两个json数组并返回差值
EN

Stack Overflow用户
提问于 2019-04-10 14:30:15
回答 1查看 1.1K关注 0票数 6

我们有一个自定义的CD Pipeline工具,不幸的是,它不能对部署参数进行版本化。因此,我将它们作为json文件放在Bitbucket Repo中,并根据此CD工具的REST API对它们进行验证。

所以我有两个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'

现在,如果两个json有差异,我会得到一个true或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脚本的变量中,并将其转换为我可以使用的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-10 14:37:39

您可以使用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": []
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55606056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档