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(@)