Erik
Erik

Reputation: 3198

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

I have a .json file which I want to read, take all the contents.. and append it to a json string that's in a bash variable

input.json

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

OUR_BIG_JSON variable

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

and a json I want to append to.. it's residing in a variable so we must echo it as we use jq

command attempt

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.. 

next line fails

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

out comes errors when trying to take the $inputs_json contents and just pipe it into the variable.. basically append to the JSON in memory..

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

Upvotes: 0

Views: 763

Answers (1)

pmf
pmf

Reputation: 36078

Using the --argjson option to read in the contents of your shell variable enables you to use it as variable inside the jq filter, too. Your input file can normally be read in via parameter.

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

For example:

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

Or by making the input too a variable inside the jq filter

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

With the -n option you could also reference the input using input:

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

And there's also the options --argfile and --slurpfile to read in the input file as variable directly...


As you have tagged bash you could also do it the other way around and use a herestring <<< to read in the bash variable as input and then using either --argfile or --slurpfile to reference the file content through a variable. For instance:

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

Upvotes: 2

Related Questions