You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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" }
]

关键修正点说明

  1. 正确访问嵌套属性:用$input.path('$elem._source.display')替代直接的$elem._source.display,这是API Gateway Velocity模板中解析嵌套JSON属性的标准方式,能精准提取display字段的值。
  2. 字符串序列化:给提取到的值加上双引号",确保输出的是合法JSON字符串,而非对象的原始字符串表示。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:32:51