keyが動的に決まるjsonをjqコマンドで扱うには

このようにkeyの部分が動的に決まるjsonをときどき見ることがある。

{
 "なんか": 1,
 "動的に": 2,
 "決まる": 3
}

上記のようなjsonからkeyの部分を取り出すにはどうすればよいだろうか?
以下のような出力が欲しい。

なんか
動的に
決まる

jqコマンドのto_entriesクエリを使うと良い。
以下のように、 {"k": "v"} 形式のjsonを {"key": "k", "value": "v"}形式に変換できる。

$ cat hoge.json | jq '. | to_entries[]'
{
 "key": "なんか",
 "value": 1
}
{
 "key": "動的に",
 "value": 2
}
{
 "key": "決まる",
 "value": 3
}

あとはkeyを抽出すれば完了である。

$ cat hoge.json | jq -r '. | to_entries[].key'
なんか
動的に
決まる
$

なお、以下のようにkeysを使っても良い。

$ cat hoge.json | jq -r '. | keys[]'
なんか
動的に
決まる
$ 

ただし、keys は keyの配列を返すので、key1つずつについて処理するクエリを書くのに向いていない 。
先に紹介した to_entries[] | .key の書き方であれば、以下のようにkey1つずつについて処理できるのでおすすめである。

$ cat hoge.json | jq -r '. | to_entries[] | .key + "の値は " + (.value | tostring)'
なんかの値は 1
動的にの値は 2
決まるの値は 3
$

この記事が気に入ったらサポートをしてみませんか?