概要
- 知っていると便利だと思うjmespathの使用方法を記載しています
TL;DR
- 公式のチュートリアルやExampleがわかりやすいです
- 条件にマッチするものを取得する場合のクエリ条件
"?<key>==`<取得したい値`>"
- 平坦化する場合は基本的に
<クエリ条件> | []
-
Built-in Functions
- 使える関数
- abs
- avg
- contains
- ceil
- floor
- join
- keys
- length
- max
- min
- sort
- to_string
- to_number
- type
- values
- ポイント
-
.<functions>(@)
と記載する
-
- 使える関数
準備
jmespathをinstallする
-
pip install jmespath
を実行する
sample data
{
"test": [
{
"id": 1,
"name": "A",
"color": "red"
},
{
"id": 2,
"name": "B",
"color": "blue"
},
{
"id": 3,
"name": "C",
"color": "red"
}
],
"sample":[
{
"id": 1,
"name": "D",
"type": "fire"
},
{
"id": 2,
"name": "E",
"type": "water"
},
{
"id": 3,
"name": "F",
"type": "water"
}
]
}
構文
基本的な構文
-
jmespath.search("<クエリ条件>", <検索したい変数>)
-
jmespath.search()
の()の中にクエリ条件と変数を記載する - クエリ条件は
""(ダブルクォーテーション)
でくくる - クエリ条件のあとに
,(カンマ)
を記載し変数を記載する
-
全ての値を取得する
- クエリ条件を
*(アスタリスク)
を使用するjmespath.search("*", <検索したい変数>)
条件にマッチした値を取得する
- クエリ条件:
"test[?color==`red`]"
- listの中で
"?<key>==`<取得したい値`>"
と記述する
- listの中で
- ポイント
- 条件式は
?
で始める - 取得したい値は
` `(バッククォーテーション)
で囲む - listの中に書く
- 条件式は
使用例
- 使用例は、sample dataを使っています。
listの中身を取得する
-
クエリ条件
-
jmespath.search("test[]",data)
-
test
をsample
に置き換えればsample
配下のlistが取れます。
-
-
-
出力結果
[
{”id”: 1, ”name”: ”A”, ”color”: ”red”
},
{”id”: 2, ”name”: ”B”, ”color”: ”blue”
},
{”id”: 3, ”name”: ”C”, ”color”: ”red”
}
]
nameだけ取得する
-
クエリ条件
jmespath.search("test[].name",data)
-
出力結果
[”A”, ”B”, ”C”]
全てのnameを取得する
-
クエリ条件
-
jmespath.search("*[].name",data)
-
"*[].name"
の.name
をid
やcolor
にすることで取得できる値を変えることができます。
-
-
-
出力結果
[”A”, ”B”, ”C”, ”D”, ”E”, ”F”]
条件にマッチした値の情報を取得する
-
クエリ条件
jmespath.search("test[?color==`red`]",data)
-
出力結果
[
{”id”: 1, ”name”: ”A”, ”color”: ”red”
},
{”id”: 3, ”name”: ”C”, ”color”: ”red”
}
]
条件にマッチした値を取得し、特定の値を出力する
-
クエリ条件
jmespath.search("sample[?type==`water`].name",data)
-
出力結果
[”E”, ”F”]
取得した値の要素数を数える
typeがarrayの場合
-
クエリ条件
jmespath.search("sample.length(@)",data)
-
出力結果
3
-
length(@)
がない場合の出力
[
{”id”: 1, ”name”: ”D”, ”type”: ”fire”
},
{”id”: 2, ”name”: ”E”, ”type”: ”water”
},
{”id”: 3, ”name”: ”F”, ”type”: ”water”
}
]
typeがobjectの場合
- クエリ条件
jmespath.search("sample[].length(@)",data)
- 出力結果
[3, 3, 3]
[
{”id”: 1, ”name”: ”D”, ”type”: ”fire”
},
{”id”: 2, ”name”: ”E”, ”type”: ”water”
},
{”id”: 3, ”name”: ”F”, ”type”: ”water”
}
]
typeを確認する
arrayの場合
- クエリ条件
jmespath.search("sample.type(@)",data)
- 出力結果
”array”
objectの場合
- クエリ条件
jmespath.search("sample.type(@)",data)
- 出力結果
[”object”]
keyだけ取得する
-
クエリ条件
jmespath.search("sample[].keys(@)",data)
-
出力結果
[
[”id”, ”name”, ”type”
],
[”id”, ”name”, ”type”
],
[”id”, ”name”, ”type”
]
]
投影する
- クエリ条件
-
jmespath.search("*[*].name",data)
- (正確な表現ではないかもしれませんが)元々の形を維持したまま出力する
-
- 出力結果
[[”A”, ”B”, ”C”], [”D”, ”E”, ”F”]]
平坦化する
- クエリ条件
-
jmespath.search("*[*].name | []",data)
もしくはjmespath.search("*[*].name[]",data)
- listがネストしているものを平坦化している
-
[”A”, ”B”, ”C”, ”D”, ”E”, ”F”]
最後に
- 本記事を読んでいただきありがとうございます。
- 個人的にjmespathで便利そうな使用例を記載しました。
正確でない表現や意味が間違っている箇所がありましたら、ご指摘していただきたいです。 - jmespathを学ぶことでjson形式のデータを簡単に扱えるようになったと感じています。
本記事を参考にしていただけると幸いです。