jqでドットが入ったkeyを扱う
Page content
jsonのkey名に”.“が入っていると困惑することになる。
jqの基本用法
シェルでjsonを扱う際、jqを使って要素を取り出すことができる。
{
"result": {
"yomiuri": {
"first_pick": "sasaki"
}
}
}$ cat draft.json | jq .result.yomiuri.first_pick
sasaki要素がリストの場合、[]を指定すればリストを剥がして取得できる。
Elasticsearchに直接クエリをかける場合に以下のように使える。
$ curl -XGET "https:DomainfElasticSearch/myIndex/_serach" | jq .hits.hits
[ {<index1>}, {<index2>}, {<index3>}, ... ]$ curl -XGET "https:DomainfElasticSearch/myIndex/_serach" | jq .hits.hits[]
{<index1>}, {<index2>}, {<index3>}, ...引き抜いた要素を組み替えて出力したりもできる。
$ curl -XGET "https:DomainfElasticSearch/myIndex/_serach" | jq .hits.hits[]._source | [.header.myid1, .body.myid2]
["ID101", "ID201"], ["ID102", "ID202"], ...keyにドットが入っている場合
”.“(ドット)で階層を繋いで要素を指定するので、key名にドットが使われていたりすると困ることになる。
{
"result": {
"yomiuri.giants": {
"first_pick": "sasaki"
}
}
}$ cat draft.json | jq .result.yomiuri.giants.first_pick
nullこの場合、ドットでなく角括弧[“key名”]で要素を指定するとちゃんと取れる。
その際、角括弧もしくは全体を’(シングルクオート)で括る。
$ cat draft.json | jq .result'["yomiuri.giants"]'.first_pick
sasaki
$ cat draft.json | jq '.result["yomiuri.giants"].first_pick'
sasakikeyに数字やハイフンが入っていても同様で、ドットでは指定できないが角括弧で指定できる。
{
"result": {
"2019": {
"yomiuri-giants": {
"1位": "sasaki"
}
}
}
}$ cat draft.json | jq .result'["2019"]["yomiuri-giants"]["1位"]'
sasakiおわり
今年のドラフト、自分は佐々木君がいいんですけどどうですかね?
ミーハーであれなんですけどU-18見てたら石川君も好きになっちゃいますね。


