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'

sasaki

keyに数字やハイフンが入っていても同様で、ドットでは指定できないが角括弧で指定できる。

{
    "result": {
        "2019": {
            "yomiuri-giants": {
                "1位": "sasaki"
            }
        }
    }
}
$ cat draft.json | jq .result'["2019"]["yomiuri-giants"]["1位"]'

sasaki

おわり

今年のドラフト、自分は佐々木君がいいんですけどどうですかね?

ミーハーであれなんですけどU-18見てたら石川君も好きになっちゃいますね。