Deleting multiple keys at once with jq

There is no need to use both map and del.

You can pass multiple paths to del, separated by commas.

Here is a solution using "dot-style" path notation:

jq 'del( .[] .Country, .[] .number, .[] .Language )' test.json
  • doesn't require quotation marks (which you may feel makes it more readable)
  • doesn't group the paths (requires you to retype .[] once per path)

Here is an example using "array-style" path notation, which allows you to combine paths with a common prefix like so:

jq 'del( .[] ["Country", "number", "Language"] )' test.json
  • Combines subpaths under the "last-common ancestor" (which in this case is the top-level list iterator .[])

peak's answer uses map and delpaths, though it seems you can also use delpaths on its own:

jq '[.[] | delpaths( [["Country"], ["number"], ["Language"]] )]' test.json
  • Requires both quotation marks and array of singleton arrays
  • Requires you to put it back into a list (with the start and end square brackets)

Overall, here I'd go for the array-style notation for brevity, but it's always good to know multiple ways to do the same thing.


You can provide a stream of paths to delete:

$ cat test.json | jq 'map(del(.Country, .number, .Language))'

Also, consider that, instead of blacklisting specific keys, you might prefer to whitelist the ones you do want:

$ cat test.json | jq 'map({label, region, locale, currency})'

A better compromise between "array-style" and "dot-style" notation mentioned in by Louis in his answer.

del(.[] | .Country, .number, .Language)

jqplay


This form can also be used to delete a list of keys from a nested object (see russholio's answer):

del(.a | .d, .e)

Implying that you can also pick a single index to delete keys from:

del(.[1] | .Country, .number, .Language)

Or multiple:

del(.[2,3,4] | .Country,.number,.Language)

You can delete a range using the range() function (slice notation doesn't work):

del(.[range(2;5)] | .Country,.number,.Language)  # same as targetting indices 2,3,4

Some side notes:

map(del(.Country,.number,.Language))
# Is by definition equivalent to
[.[] | del(.Country,.number,.Language)]

If the key contains special characters or starts with a digit, you need to surround it with double quotes like this: ."foo$", or else .["foo$"].


In addition to @user3899165's answer, I found that to delete a list of keys from "sub-object"

example.json

{
    "a": {
        "b": "hello",
        "c": "world",
        "d": "here's",
        "e": "the"
    },
    "f": {
        "g": "song",
        "h": "that",
        "i": "I'm",
        "j": "singing"
    }
}

$ jq 'del(.a["d", "e"])' example.json

Tags:

Jq