我有EventBus,它有一个有特定目标的规则。目标内部有一个带有InputPath 和InputTemplate 的InputTransformer。我想要将其转换为数组。
我使用 detail 字段将自定义事件发送到 EventBus,其中我需要 JSON
{
"version": "0",
"id": "9fd93571-3201-4e0d-6cf0-328ff344c9e3",
"detail-type": "test",
"source": "foobar",
"account": "192675374686",
"time": "2023-10-10T11:22:01Z",
"region": "us-east-1",
"resources": [],
"detail": {
"address": {
"field": "888",
"innerField": {
"someInnerField": "999"
}
}
}
}
我的预期输出是数组,当我尝试使用 InputPath 和 InputTemplate 添加方括号时,它会在不带双引号的情况下发送它,但它会进行一些转换。
输入路径
{
"detail": "$.detail"
}
输入模板
[{
"customField": <detail>
}]
实际输出(从配置了目标的死信队列中获取的消息,由于无效的 json,它被发送到那里,这是真的)
[{
"customField": {address:{field:888,innerField:{someInnerField:999}}}
}]
预期产出
[{
"customField": {
"address": {
"field": "888",
"innerField": {
"someInnerField": "999"
}
}
}
}]
我不想做任何映射,只是想将 **detail ** 字段的整个 JSON 放入一个数组中,其中包含一个具有属性“customField”的对象:并将 JSON 字符串作为值。
[{“customField”:
它可以按预期使用不带方括号的简单模板,但我需要一个数组:
{
"customField": <detail>
}
输出
{
"customField": {
"address": {
"field": "888",
"innerField": {
"someInnerField": "999"
}
}
}
}
什么完全可以工作,但它不适用于具有很多字段的 JSON
当然,我们可以映射InputPath中的每个字段,然后通过变量将其放入模板中。已经检查过,有效。
路径
{
"field": "$.detail.address.field",
"someInnerField": "$.detail.address.innerField.someInnerField"
}
模板
[{
"customField": {
"address": {
"field": "<field>"
"innerField": {
"someInnerField": "<someInnerField>"
}
}
}
}]
我们有一个类似的带有EventBridge管道的InputTransformer,似乎它应该按照我想要的方式工作(参见输出),但最终,它没有,我收到不带双引号的字符串
不幸的是,没有办法实现你所要求的。 EventBridge 输入转换器尝试稍微聪明地为您提供帮助并确保您有有效的输出,但在这种情况下,它有害无益。
逻辑本质上是:“您是否正在尝试创建 JSON 输出?如果是,请尝试创建有效的 JSON。如果不是,请尝试创建有效的string。这意味着删除引号,这样您就不必逃离他们。”
不幸的是,今天的决定仅基于输入变压器是否以
{
开头。以 [
开头的转换器被视为字符串而不是 JSON。
这就是该服务自 2016 年推出该功能以来的工作方式,因此遗憾的是,我们无法在不破坏现有客户的情况下更改默认行为。
但是,EventBridge 团队正在评估如何允许您选择加入您希望的行为。