Skip to content

Instantly share code, notes, and snippets.

@joar
Last active July 25, 2024 00:55
Show Gist options
  • Save joar/776b7d176196592ed5d8 to your computer and use it in GitHub Desktop.
Save joar/776b7d176196592ed5d8 to your computer and use it in GitHub Desktop.
Add a field to an object with JQ
# Add field
echo '{"hello": "world"}' | jq --arg foo bar '. + {foo: $foo}'
# {
# "hello": "world",
# "foo": "bar"
# }
# Override field value
echo '{"hello": "world"}' | jq --arg foo bar '. + {hello: $foo}'
{
"hello": "bar"
}
# {
# "hello": "bar"
# }
# Concat and add
echo '{"hello": "world"}' | jq --arg foo bar '. + {foo: ("not" + $foo)}'
# {
# "hello": "world",
# "foo": "notbar"
# }
@fogfish
Copy link

fogfish commented Jul 1, 2020

A few more examples to insert json:

echo '{"hello": "world"}' | jq --argjson json '{"foo": "bar"}' '. + {foo: $json}'

{
  "hello": "world",
  "foo": {
    "foo": "bar"
  }
}

and same but with files

cat template.json | jq --argjson json "`<snippet.json`" '. + {foo: $json}'

@zrhoffman
Copy link

To add a key to a nested object, you can use .key +=:

echo '{"hello": {"value": "world"}}' | jq '.hello += {other_key: "new_val"}'
{
  "hello": {
    "value": "world",
    "other_key": "new_val"
  }
}

If you are only adding or modifying a single value, there is no need to merge JSON. Same output as above:

echo '{"hello": {"value": "world"}}' | jq '.hello.other_key = "new_val"'

@bacharya
Copy link

bacharya commented Aug 6, 2021

Example for adding an element to an array:

$ echo '[ {"data1":"A"}, {"data2":"B"} ]' | jq --arg val True '.[] += {uppercase: $val}'
[
  {
    "data1": "A",
    "uppercase": "True"
  },
  {
    "data2": "B",
    "uppercase": "True"
  }
]

@aborruso
Copy link

aborruso commented Feb 25, 2023

Hi,
I have this input

{
"a":{"fieldA":2,"fieldB":"foo"},
"b":{"fieldA":2,"fieldB":"foo"}
}

And I would like for each key, to add its value inside the related json object

{
"a":{"fieldA":2,"fieldB":"foo","key":"a"},
"b":{"fieldA":2,"fieldB":"foo","key":"b"}
}

If I run this

<input.json jq  '[.|keys[] as $key | .[] + {key: $key}]'

I obtain something similar, but I have the cartesian product

[
  {
    "fieldA": 2,
    "fieldB": "foo",
    "key": "a"
  },
  {
    "fieldA": 2,
    "fieldB": "foo",
    "key": "a"
  },
  {
    "fieldA": 2,
    "fieldB": "foo",
    "key": "b"
  },
  {
    "fieldA": 2,
    "fieldB": "foo",
    "key": "b"
  }
]

How to avoid it?

Thank you

@MaxNanasy
Copy link

@aborruso This seems to work:

jq 'to_entries | map( { (.key) : (.value + { key: .key }) }) | add'

@aborruso
Copy link

aborruso commented Jun 2, 2023

thank you @MaxNanasy

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment