← ブログに戻る

JSONata入門 — JSON経験者のためのクエリ言語ガイド

こんにちは!今回から全3回にわたって JSONata を解説していきます。

JSONataは、JSONデータに対して クエリ・変換 を行うための軽量な式言語です。XPathやSQLに着想を得て設計されており、2024年11月からは AWS Step Functions にも公式採用されています。

この記事は「JSONは分かるけどJSONataは初めて」という方向けです。

JSONataとは?

JSONata は以下の特徴を持ちます:

  • 宣言的: 「何が欲しいか」を書くだけで結果が得られる
  • 軽量: ライブラリは数十KB、ブラウザでもNode.jsでも動く
  • 強力: フィルタ、ソート、集計、オブジェクト構築が1式で完結

SQLを使ったことがある方なら、直感的に理解できるはずです。

パス式 — ドットで辿る

JSONataの最も基本的な操作は「パス式」です。JavaScriptのドット記法と同じ感覚でフィールドにアクセスできます。

// 入力
{
  "Name": "Alice",
  "Address": {
    "City": "Tokyo",
    "Zip": "100-0001"
  }
}
JSONata式結果
Name"Alice"
Address.City"Tokyo"
Address.Zip"100-0001"

ネストが深くなっても、ドットを繋ぐだけです。

配列アクセス — インデックスで取得

配列へのアクセスはJavaScriptと同じ0始まりのインデックスを使います。

// 入力
{ "Numbers": [10, 20, 30, 40] }
JSONata式結果
Numbers[0]10
Numbers[2]30
Numbers[-1]40(末尾から)

配列のプロパティ自動展開

JSONataの便利機能の1つが「配列の中身に対するプロパティアクセス」です。

// 入力
{
  "Items": [
    {"name": "Apple", "price": 100},
    {"name": "Banana", "price": 200},
    {"name": "Cherry", "price": 300}
  ]
}
JSONata式結果
Items.name["Apple", "Banana", "Cherry"]
Items.price[100, 200, 300]

JavaScriptなら Items.map(i => i.name) と書くところを、Items.name だけで実現できます。

ワイルドカード — * で全プロパティ

* はオブジェクトの全フィールド値を配列で返します。

// 入力
{
  "Address": {
    "City": "Osaka",
    "Zip": "530-0001",
    "Country": "Japan"
  }
}
// JSONata式
Address.*

// 結果
["Osaka", "530-0001", "Japan"]

フィールド名を知らなくても全値を取得したい場合に便利です。

フィルタ式 — [] で条件指定

配列に対して [条件式] を書くとフィルタリングができます。SQLの WHERE 句に相当します。

// 入力
{
  "Items": [
    {"name": "Apple", "price": 100},
    {"name": "Banana", "price": 200},
    {"name": "Cherry", "price": 300}
  ]
}
JSONata式結果
Items[price > 150]Banana, Cherryのオブジェクト
Items[price > 150].name["Banana", "Cherry"]
Items[name = "Apple"]{"name": "Apple", "price": 100}

フィルタとプロパティアクセスをチェーンできるのがJSONataの醍醐味です。

ソート — $sort() 関数

配列のソートには $sort() を使います。

$sort(Items, function($a, $b) { $a.price > $b.price })

比較関数で $a.price > $b.price を返すと 昇順$a.price < $b.price降順 になります。

まとめ

概念構文用途
パス式field.nestedフィールドアクセス
インデックスarray[0]配列要素取得
自動展開array.field全要素からプロパティ抽出
ワイルドカードobject.*全フィールド値取得
フィルタarray[条件]条件で絞り込み
ソート$sort(array, fn)配列の並べ替え

次回は JSONata実践 — 関数と変換 で、組み込み関数や条件式、オブジェクト構築について詳しく解説します。

実際に手を動かして学びたい方は JSONata Learning アプリ もぜひ試してみてください!