passing arguments to jq filter

JsonBashParameter PassingJq

Json Problem Overview


Here is my config.json:

{
    "env": "dev",
    "dev": {
        "projects" : {
            "prj1": {
                "dependencies": {},
                "description": ""
            }
        }
    }
}

Here are my bash commands:

PRJNAME='prj1'

echo $PRJNAME

jq --arg v "$PRJNAME" '.dev.projects."$v"' config.json 
jq '.dev.projects.prj1' config.json 

The output:

prj1
null
{
  "dependencies": {},
  "description": ""
}

So $PRJNAME is prj1, but the first invocation only outputs null.

Can someone help me?

Json Solutions


Solution 1 - Json

The jq program .dev.projects."$v" in your example will literally try to find a key named "$v". Try the following instead:

jq --arg v "$PRJNAME" '.dev.projects[$v]' config.json 

Solution 2 - Json

You can use --argjson too when you make your json.

--arg a v   	# set variable $a to value <v>;
--argjson a v	# set variable $a to JSON value <v>;

Solution 3 - Json

As asked in a comment above there's a way to pass multiple argumets. Maybe there's a more elegant way, but it works.

  • If you are sure always all keys needed you can use this:

jq --arg key1 $k1 --arg key2 $k2 --arg key3 $k3 --arg key4 $k4 '.[$key1] | .[$key2] | .[$key3] | .[$key4] '

  • If the key isn't always used you could do it like this:

jq --arg key $k ' if key != "" then .[$key] else . end'

  • If key sometimes refers to an array:

jq --arg key $k ' if type == "array" then .[$key |tonumber] else .[$key] end'

of course you can combine these!

Solution 4 - Json

you can do this:


    key="dev.projects.prj1"
    filter=".$key"
    cat config.json | jq $filter

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionlisi4okView Question on Stackoverflow
Solution 1 - Jsonuser3899165View Answer on Stackoverflow
Solution 2 - JsonSebastien DIAZView Answer on Stackoverflow
Solution 3 - JsonLuWaView Answer on Stackoverflow
Solution 4 - JsonZ.SanView Answer on Stackoverflow