14.6. 高度な JSONata 機能
JSONata を使用すると、配列処理や組み込み関数などの高度な機能を適用して、イベントをより効率的に変換できます。
14.6.1. 配列処理 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
JSONata を使用すると、イベントペイロード内の配列を簡単に操作できます。アイテムをカウントしたり、条件に基づいてフィルタリングしたり、集計値を計算したりできます。
注文内のアイテムとコンピュート合計の処理例
{
"specversion": "1.0",
"id": id,
"type": "order.processed",
"source": source,
"time": $now(),
"itemcount": $count(order.items),
"multiorder": $count(order.items) > 1,
"data": {
"order": order.id,
"items": order.items[quantity > 1].{
"product": name,
"quantity": quantity,
"lineTotal": price * quantity
},
"totalvalue": $sum(order.items.(price * quantity))
}
}
これを入力とします。
{
"id": "12345",
"source": "https://example.com/orders",
"order": {
"id": "order-67890",
"items": [
{ "name": "Laptop", "price": 1000, "quantity": 1 },
{ "name": "Mouse", "price": 50, "quantity": 2 },
{ "name": "Keyboard", "price": 80, "quantity": 3 }
]
}
}
変換により次の出力が生成されます。
{
"specversion": "1.0",
"id": "12345",
"type": "order.processed",
"source": "https://example.com/orders",
"time": "2025-03-03T09:13:23.753Z",
"itemcount": 3,
"multiorder": true,
"data": {
"order": "order-67890",
"items": [
{ "product": "Mouse", "quantity": 2, "lineTotal": 100 },
{ "product": "Keyboard", "quantity": 3, "lineTotal": 240 }
],
"totalvalue": 1340
}
}
この例では、以下が適用されます。
-
$count(order.items)は、配列内のアイテム数をカウントします。 -
[quantity > 1]フィルターは、数量が 1 より大きいアイテムのみを選択します。 -
$sum(order.items.(price * quantity))は合計値を計算します。
14.6.2. 組み込み関数の使用 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
JSONata には、文字列、数値、日付、配列を操作できるさまざまな組み込み関数が含まれています。これらの関数は、既存のデータから派生した新しいフィールドを使用してイベントを補完できます。
組み込み関数を使用してメタデータを追加する例
{
"specversion": "1.0",
"id": id,
"type": "user.event",
"source": source,
"time": time,
"timestamp": $now(),
"username": $lowercase(data.user.name),
"initials": $join($map($split(data.user.name, " "), function($v) { $substring($v, 0, 1) }), ""),
"data": $
}
この例では、以下が適用されます。
-
$now()は現在のタイムスタンプを追加します。 -
$lowercase()はユーザー名を小文字に変換します。 -
$split()は名前を部分に分割し、$map()はそれぞれの最初の文字を抽出し、$join()はそれらを頭文字に結合します。