wjtk
wjtk

Reputation: 1247

How to extract all (also nested) key names with jq

How can I extract all key names, even in nested objects with jq? For example, I have json:

{ "a": 1, "b": { "c": 2 } }

and I want to get list: a, b, b.c

I know that for top level keys I can get this, with: . | to_entries[] | .key, but what about keys in nested objects?

Upvotes: 22

Views: 11096

Answers (2)

CervEd
CervEd

Reputation: 4243

Given input foo.json

{"a":1,"b":[{"c":2}]}
jq '[
paths |
map(select(type!="number")) |
select(length > 0) |
join(".")
] | unique' foo.json

outputs

[
  "a",
  "b",
  "b.c"
]

Upvotes: 1

RomanPerekhrest
RomanPerekhrest

Reputation: 92854

Short jq solution:

jq -r '[paths | join(".")]'  jsonfile

The output:

[
  "a",
  "b",
  "b.c"
]

  • paths function outputs the paths to all the elements in its input

  • join(".") - to concatenate keys within hierarchical paths

Upvotes: 30

Related Questions