14.5. 常见转换模式


为了有效地形成您的事件数据,您可以使用常见的 JSONata 转换模式来保留、提取、重组或有条件地修改事件。

14.5.1. 保留原始事件结构

您可以添加或调整属性,同时保持事件的其余部分保持不变,以便下游用户以最小的修改接收原始数据。

在保留原始事件结构的同时添加静态属性的示例

{
  "specversion": "1.0",
  "id": id,
  "type": type,
  "source": source,
  "time": time,
  "data": data,
  "newattribute": "static value"
}
Copy to Clipboard Toggle word wrap

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": $
}
Copy to Clipboard Toggle word wrap

在 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))
  }
}
Copy to Clipboard Toggle word wrap

根据以上转换过程,这个 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}
    ]
  }
}
}
Copy to Clipboard Toggle word wrap

转换会生成以下输出:

{
  "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
  }
}
Copy to Clipboard Toggle word wrap

使用此模式与需要特定结构或计算的字段的 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": $
}
Copy to Clipboard Toggle word wrap

在给定示例中:

  • 如果事件类型是 order. created,则新类型将变为 new.order ;否则,它被设置为 update .order
  • 如果有效负载中的 total 字段大于 1000,则会添加一个 优先级 属性,值为 high ;否则,它被设置为 normal
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat