AWS API Gateway映射模板无法正确输出指定变量的技术咨询
解决AWS API Gateway Mapping Template提取嵌套JSON属性的问题
看起来你在处理Elasticsearch返回的响应时,踩中了Velocity模板解析嵌套属性的坑。你的模板之所以输出完整对象加字面量._source.display,核心是Velocity没正确识别嵌套属性的访问方式,同时缺少字符串序列化处理。另外得提一句:你原本期望的输出里有重复的address键,这在JSON中是不合法的(解析器通常只会保留最后一个键值对),所以我先给你规范的合法解决方案,再解释原因。
修正后的Mapping Template
推荐方案:输出地址字符串数组(规范JSON结构)
这个方案生成包含所有地址的数组,是最符合JSON标准的结构:
#set($inputRoot = $input.path('$')) { "addresses": [ #foreach($elem in $inputRoot.hits.hits) "$input.path('$elem._source.display')"#if($foreach.hasNext),#end #end ] }
输出示例:
{ "addresses": [ "1/28 George Street, Casterton VIC 3311", "52 St Georges Road, Corio VIC 3214" ] }
可选方案:输出单个地址对象的数组
如果业务需要每个地址作为独立对象,可用这个模板:
#set($inputRoot = $input.path('$')) [ #foreach($elem in $inputRoot.hits.hits) { "address": "$input.path('$elem._source.display')" }#if($foreach.hasNext),#end #end ]
输出示例:
[ { "address": "1/28 George Street, Casterton VIC 3311" }, { "address": "52 St Georges Road, Corio VIC 3214" } ]
关键修正点说明
- 正确访问嵌套属性:用
$input.path('$elem._source.display')替代直接的$elem._source.display,这是API Gateway Velocity模板中解析嵌套JSON属性的标准方式,能精准提取display字段的值。 - 字符串序列化:给提取到的值加上双引号
",确保输出的是合法JSON字符串,而非对象的原始字符串表示。 - JSON合法性优化:把重复键结构调整为数组,避免解析时出现异常或数据丢失。
关于你原本期望的无效JSON结构
你提到的{ "address": "...", "address": "..." }属于无效JSON(同一对象内不允许重复键名)。如果业务逻辑必须用这种格式(不推荐),可以用以下模板,但要注意解析端的兼容性:
#set($inputRoot = $input.path('$')) { #foreach($elem in $inputRoot.hits.hits) "address": "$input.path('$elem._source.display')"#if($foreach.hasNext),#end #end }
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

