JMESPath
表示
JMESPath
[編集]JMESPathは、JSONデータから特定の要素を抽出するためのクエリ言語です。JSONデータ構造をナビゲートし、必要な情報を取り出すための標準的な方法を提供します。
基本構文
[編集]ドット表記
[編集]最も基本的な構文は、ドット(.)を使用してJSONの階層構造をナビゲートします。
// 元のJSONデータ { "user": { "name": "John", "age": 30 } }
- クエリ
user.name
- 結果
"John"
配列アクセス
[編集]配列要素へのアクセスは角括弧[]を使用します。
// 元のJSONデータ { "users": [ {"name": "John"}, {"name": "Jane"} ] }
- クエリ
users[*].name | sort(@)
- 結果
["Jane", "John"]
高度な機能
[編集]パイプライン演算子
[編集]パイプライン演算子(|)を使用して、複数の操作を連結できます。
- クエリ
users[*].name | sort(@)
- 結果
["Jane", "John"]
フィルター式
[編集]フィルター式は、条件に一致する要素のみを選択します。
- クエリ
users[?age > `20`]
- 結果
[要素のうち、ageが20より大きいもの]
組み込み関数
[編集]JMESPathには多くの組み込み関数が用意されています。
配列関数
[編集]- length(): 配列やオブジェクトの長さを返す
- contains(): 配列に特定の要素が含まれているかチェック
- sort(): 配列を並び替え
文字列関数
[編集]- join(): 配列の要素を文字列として結合
- split(): 文字列を配列に分割
- to_string(): 値を文字列に変換
実践的な例
[編集]ネストされたデータの抽出
[編集]// 元のJSONデータ { "store": { "books": [ { "title": "The Great Gatsby", "price": 9.99 }, { "title": "Moby Dick", "price": 12.99 } ] } }
- クエリ
store.books[?price < `10`].title
- 結果
["The Great Gatsby"]
複雑なフィルタリング
[編集]- クエリ
store.books[*].{title: title, isExpensive: price > `10`}
- 結果
[ {"title": "The Great Gatsby", "isExpensive": false}, {"title": "Moby Dick", "isExpensive": true} ]
よくあるエラーと対処法
[編集]一般的なエラー
[編集]- 構文エラー: クエリの構文が正しくない
- 型エラー: 期待される型と異なる型のデータにアクセスしようとした
- 存在しないキー: 存在しないキーや配列インデックスにアクセスしようとした
デバッグのヒント
[編集]- クエリを小さな部分に分けてテスト
- 中間結果の確認
- エラーメッセージの詳細な確認
ベストプラクティス
[編集]- クエリは可能な限りシンプルに保つ
- 複雑なクエリは小さな部分に分割する
- フィルター式では適切な型比較を使用する
- パフォーマンスを考慮したクエリ設計を心がける
コマンドラインツール
[編集]JMESPathをコマンドラインで使用する場合、jp(JMESPath CLI)ツールが便利です。
# インストール pip install jmespath-terminal # 使用例 echo '{"user": {"name": "John"}}' | jp "user.name"
リファレンス
[編集]演算子一覧
[編集]演算子 | 説明 | 例 |
---|---|---|
. | ドット表記(オブジェクトアクセス) | user.name |
[] | 配列アクセス | users[0] |
[*] | ワイルドカード(全要素) | users[*].name |
パイプライン | sort(@) | |
? | フィルター式 | users[?age > `20`] |
関数リファレンス
[編集]関数名 | 説明 | 例 |
---|---|---|
length() | 長さを返す | length(users) |
contains() | 要素の存在確認 | contains(users, 'John') |
sort() | 並び替え | sort(users) |
join() | 配列を文字列に結合 | join(', ', names) |
to_string() | 文字列に変換 | to_string(@) |