14.5. 一般的な変換パターン
イベントデータを効果的に形成するには、イベントの保存、抽出、再構築、条件付き変更に一般的な JSONata 変換パターンを活用できます。
14.5.1. オリジナルのイベント構造を維持する リンクのコピーリンクがクリップボードにコピーされました!
イベントの残りの部分は変更せずに属性を追加または調整できるため、ダウンストリームのコンシューマーは最小限の変更で元のデータを受信できます。
元のイベント構造を維持しながら静的属性を追加する例
{
"specversion": "1.0",
"id": id,
"type": type,
"source": source,
"time": time,
"data": data,
"newattribute": "static value"
}
14.5.2. フィールドを属性として抽出する リンクのコピーリンクがクリップボードにコピーされました!
ペイロードの値をトップレベルの CloudEvent 属性に昇格して、フィルタリングとルーティングを容易にできます。
ペイロードからユーザー ID とリージョンを抽出し、属性として公開する例
{
"specversion": "1.0",
"id": id,
"type": "user.event",
"source": source,
"time": time,
"userid": data.user.id,
"region": data.region,
"data": $
}
JSONata では、$ 記号は入力オブジェクト全体を表します。data: $ を使用すると、選択したフィールドを昇格しながら元のイベントペイロードが保持されます。
14.5.3. イベントデータの再構築 リンクのコピーリンクがクリップボードにコピーされました!
JSONata を使用して、ペイロードの再構築、フィールド名の変更、オブジェクトのネスト、計算の実行を行い、イベントを別のシステムに必要なスキーマに変換します。
注文イベントを再設定し、アイテムの合計値を計算する例
{
"specversion": "1.0",
"id": order.id,
"type": "order.transformed",
"source": "transform.order-processor",
"time": order.time,
"orderid": order.id,
"data": {
"customer": {
"id": order.user.id,
"name": order.user.name
},
"items": order.items.{ "sku": sku, "quantity": qty, "price": price },
"total": $sum(order.items.(price * qty))
}
}
上記の変換と、入力として次の JSON オブジェクトがあるとします。
{
"order": {
"time": "2024-04-05T17:31:05Z",
"id": "8a76992e-cbe2-4dbe-96c0-7a951077089d",
"user": {
"id": "bd9779ef-cba5-4ad0-b89b-e23913f0a7a7",
"name": "John Doe"
},
"items": [
{"sku": "KNATIVE-1", "price": 99.99, "qty": 1},
{"sku": "KNATIVE-2", "price": 129.99, "qty": 2}
]
}
}
}
変換により次の出力が生成されます。
{
"specversion": "1.0",
"id": "8a76992e-cbe2-4dbe-96c0-7a951077089d",
"type": "order.transformed",
"source": "transform.order-processor",
"time": "2024-04-05T17:31:05Z",
"orderid": "8a76992e-cbe2-4dbe-96c0-7a951077089d",
"data": {
"customer": {
"id": "bd9779ef-cba5-4ad0-b89b-e23913f0a7a7",
"name": "John Doe"
},
"items": [
{
"sku": "KNATIVE-1",
"quantity": 1,
"price": 99.99
},
{
"sku": "KNATIVE-2",
"quantity": 2,
"price": 129.99
}
],
"total": 359.97
}
}
このパターンを使用して、特定の構造または計算フィールドを必要とする API と統合します。
14.5.4. 条件付き変換 リンクのコピーリンクがクリップボードにコピーされました!
JSONata を使用すると、条件付きロジックを変換に直接埋め込むことができ、属性またはペイロード値に基づいて動的なイベントの形成が可能になります。
条件に基づいて異なるタイプと優先順位を適用する例
{
"specversion": "1.0",
"id": id,
"type": type = "order.created" ? "new.order" : "updated.order",
"source": source,
"time": time,
"priority": data.total > 1000 ? "high" : "normal",
"data": $
}
この例では、以下のようになります。
-
イベントタイプが
order.createdの場合、新しいタイプはnew.orderになります。それ以外の場合はupdated.orderに設定されます。 -
ペイロード内の total フィールドが 1000 より大きい場合、値が
highのpriority属性が追加されます。それ以外の場合は、normalに設定されます。