如何在追加时使用 jq 和 bash 注入文件 json 数组内容

how to use jq and bash to inject a files json array contents while appending

我有一个 .json 文件,我想读取它,获取所有内容.. 并将其附加到 bash 变量 [=19] 中的 json 字符串=]

input.json

[{
    "maven": {
        "coordinates": "somelib",
        "repo": "somerepo"
    }
},
{
    "maven": {
        "coordinates": "anotherlib",
        "exclusions": ["exclude:this", "*:and-all-that"]
    }
}]

OUR_BIG_JSON变量

{
    "name": "",
    "myarray": [
        {
            "generic": {
                "package": "somepymodule"
            }
        },
        {
            "rcann": {
                "package": "anothermodule==3.0.0"
            }
        }
    ],

和一个 json 我想附加到..它驻留在一个变量中所以我们必须在我们使用 jq

时回显它

命令尝试

echo "starting..."
inputs_json=`cat input.json`

echo "$inputs_json"
echo "$OUR_BIG_JSON"

OUR_BIG_JSON=$(echo "${OUR_BIG_JSON}" |./jq '.myarray += [{"date":"today"}]')  # This worked.. 

下一行失败

OUR_BIG_JSON=$(echo "${OUR_BIG_JSON}" |./jq '.myarray += ' $inputs_json)

尝试获取 $inputs_json 内容并将其通过管道传输到变量时出现错误..基本上附加到内存中的 JSON..

jq: error: syntax error, unexpected INVALID_CHARACTER (Windows cmd shell quoting issues?) at <top-level>, line 1: .myarray += \"$inputs_json\" jq: 1 compile error

使用 --argjson 选项读取 shell 变量的内容,使您也可以将其用作 jq 过滤器中的变量。您的输入文件通常可以通过参数读取。

jq --argjson v "${OUR_BIG_JSON}" '…your filter here using $v…' input.json

例如:

jq --argjson v "${OUR_BIG_JSON}" '$v + {myarray: ($v.myarray + .)}' input.json

或者通过使输入成为 jq 过滤器中的一个变量

jq --argjson v "${OUR_BIG_JSON}" '. as $in | $v | .myarray += $in' input.json

使用 -n 选项,您还可以使用 input:

引用输入
jq --argjson v "${OUR_BIG_JSON}" -n '$v | .myarray += input' input.json

还有选项 --argfile--slurpfile 可以直接将输入文件作为变量读取...


因为你已经标记了 bash 你也可以反过来做,使用一个 herestring <<< 读入 bash 变量作为输入,然后使用 --argfile--slurpfile 通过变量引用文件内容。例如:

jq --argfile in input.json '.myarray += $in' <<< "${OUR_BIG_JSON}"