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,您可以将条件逻辑直接嵌入到您的转换中,根据属性或有效负载值启用动态事件 shaping。
根据条件应用不同类型和优先级的示例
{
"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;否则,它被设置为 update.order。 -
如果有效负载中的 total 字段大于 1000,则会添加一个
优先级属性,值为high;否则,它被设置为normal。