编辑:在写这篇文章时,我发现 1# 我没有部署我的更改,很尴尬,而且 2# 它有效。现在我只需要使用添加的字段将 JSON 字符串化。
10 分钟后: 嗯,这很难……所以我发现这个可行:
#set($payload = $util.parseJson($input.json('$')))
#set($body = "{
#foreach ($mapEntry in $payload.entrySet())
""$mapEntry.key"": ""$mapEntry.value"",
#end
""timeReceived"": ""$context.requestTime"",
""x-client-ip"": ""$context.identity.sourceIp""
}")
但是将 JSON 扩展为多行(JSON 被发送到 Firehose,然后将其存储到 S3)这是不好的。
20 分钟后:当我告诉我的高级开发人员我在做什么并用几个脏话评论 API 网关映射模板时,他嘲笑我。
40 分钟后:我知道我必须做什么:用空字符串替换所有换行符,但事实证明这比我想象的要难。我还发现对象内的嵌套值没有被字符串化。
50 分钟后: 实际上我可以通过将整个 foreach 循环放在单行中来省略换行符替换。但是我再次必须以某种方式对嵌套值进行字符串化。 requestTime 被格式化为一些愚蠢的英文格式(无意冒犯!:))
70 分钟后:正确设置嵌套值的格式真的很困难。我发现了另一个有效的例子:
#set($body = "{
#foreach ($mapEntry in $payload.entrySet())
#if ($mapEntry.value.size() > 0)
""$mapEntry.key"": {
#foreach($subEntry in $mapEntry.value.entrySet())
""$subEntry.key"": ""$subEntry.value""#if($foreach.hasNext),#end
#end
},
#else
""$mapEntry.key"": ""$mapEntry.value"",
#end
#end
""timeReceived"": $context.requestTimeEpoch}
}")
如果您不希望在其中添加新行或额外空格,这意味着:
#set($body = "{#foreach ($mapEntry in $payload.entrySet())#if($mapEntry.value.size() > 0)""$mapEntry.key"": { #foreach($subEntry in $mapEntry.value.entrySet())""$subEntry.key"": ""$subEntry.value""#if($foreach.hasNext), #end#end }, #else""$mapEntry.key"": ""$mapEntry.value"", #end#end""timeReceived"": $context.requestTimeEpoch }" )
花了 120 分钟调试和编写这篇文章:那是一段旅程。我想我已经回答了我自己的问题,所以希望现在有人可以避免像我一样花这么多时间调试这个问题。
130 分钟后: Aaand 现在我必须解决将字符串添加到我的 CloudFormation 模板中的悲剧。好家伙。 (这甚至不难,困难的部分是重新部署 API 网关,在撰写本文时,我必须从控制台手动完成)