使用 jq/bash 迭代具有变量键的 JSON 数组的最佳方法

Esb*_*rdt 1 arrays bash json jq

我有一个如下所示的 JSON 文件:

{
    "Results": [
        {
            "Severity": "LOW",
            "InstalledVersion": "1.21.1ubuntu2",
            "FixedVersion": "1.21.1ubuntu2.1"
        },
        {
            "Severity": "LOW",
            "InstalledVersion": "1.21.1ubuntu2"
        },
        {
            "Severity": "HIGH",
            "VulnerabilityID": "CVE-2016-2781"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我想创建以下 JSON 文件:

[
    {
        "Severity": "LOW",
        "InstalledVersion": "1.21.1ubuntu2",
        "FixedVersion": "1.21.1ubuntu2.1",
        "VulnerabilityID": ""
    },
    {
        "Severity": "LOW",
        "InstalledVersion": "1.21.1ubuntu2",
        "FixedVersion": "",
        "VulnerabilityID": ""
    },
    {
        "Severity": "HIGH",
        "InstalledVersion": "",
        "FixedVersion": "",
        "VulnerabilityID": "CVE-2016-2781"
    }
]
Run Code Online (Sandbox Code Playgroud)

我尝试过迭代第一个 JSON 文件,但是当我按照以下方式执行此操作时,会出现随机解析错误(使用我正在使用的真实 JSON 文件)。所以我认为我正在做的管道有问题。

jq -c '.Results[]' my.json | while read i; do
    echo $i;
done
Run Code Online (Sandbox Code Playgroud)

在 JSON 文件中,我使用jq -c '.Results[]'工作得很好,但是当我在迭代时对生成的$i执行jq操作时,我突然遇到几个解析错误。

有没有更好的方法来迭代 JSON 文件中的键值对?当然,我可以只安装 Python/R 并进行典型的练习,但我真的希望它能够在 shell 脚本中工作。

Sha*_*awn 5

您可以+通过组合两个对象的字段来将两个对象添加在一起;如果两个对象具有相同的值,则使用右手对象的值。因此,如果您将现有对象设为 RHS:

\n
\xc2\xa0jq \'[ .Results[] | {Severity:"", InstalledVersion:"", FixedVersion:"", VulnerabilityID:""} + . ]\' input.json   \n[\n  {\n    "Severity": "LOW",\n    "InstalledVersion": "1.21.1ubuntu2",\n    "FixedVersion": "1.21.1ubuntu2.1",\n    "VulnerabilityID": ""\n  },\n  {\n    "Severity": "LOW",\n    "InstalledVersion": "1.21.1ubuntu2",\n    "FixedVersion": "",\n    "VulnerabilityID": ""\n  },\n  {\n    "Severity": "HIGH",\n    "InstalledVersion": "",\n    "FixedVersion": "",\n    "VulnerabilityID": "CVE-2016-2781"\n  }\n]\n
Run Code Online (Sandbox Code Playgroud)\n