How to swap key and value of an object using jq?

In your particular case:

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

More robustly:

to_entries | map( {(.value|tostring) : .key } ) | add

Or if you prefer:

with_entries( .key as $k | .key = (.value|tostring) | .value = $k )

Caveat: all these are potentially lossy.


If some keys have equal values then probably you would like to get an array of keys as value:

to_entries
| map( {(.value) : {(.key):null} } )
| reduce .[] as $item ({}; . * $item)
| to_entries
| map({key:.key, value:(.value|keys)})
| from_entries

input:

{
  "key1": "val0",
  "key2": "val1",
  "key3": "val1"
}

output:

{
  "val0": ["key1"],
  "val1": ["key2", "key3"]
}

Tags:

Key

Json

Jq