Reputation: 1247
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
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
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