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

API Gateway映射模板JSON转逗号分隔键值对解决方案

API网关映射模板输出Kinesis数据格式异常问题

问题背景

  • 我是映射模板使用新手,传入的查询字符串参数为:userid=foo&firstname=bar&lastname=bat
  • 需求是将参数转为标准JSON结构后POST到Kinesis,期望的JSON结构如下:
{  
    "userid":"foo",
    "firstname":"bar",
    "lastname":"bat"
}
  • 实际消费端Lambda接收到的Kinesis数据为逗号分隔的键值对格式:userid=foo, firstname=bar, lastname=bat,检索历史论坛帖子未找到可行解决方案。
  • 当前使用的映射模板配置如下:
{
    #set($data = {
        "userid":"$input.params('userid')",
        "firstname":"$input.params('firstname')",
        "lastname":"$input.params('lastname')"
    })
    "StreamName": "xyz",
    "Data": "$util.base64Encode($data)",
    "PartitionKey": "0"
}
  • 排查确认:映射模板会将$data字典对象转换为逗号分隔的键值对列表,已猜测可通过直接构造JSON字符串规避问题,但想确认是否存在相关配置可直接让系统输出标准JSON格式。

解决方案

不存在可以修改Map默认字符串转换行为的配置项。问题核心原因是VTL中创建的HashMap对象在被隐式转为字符串时,会调用Java HashMap默认的toString()方法,该方法的输出规则就是逗号分隔的key=value格式,不会自动生成符合JSON规范的字符串。
可以通过以下两种方式实现标准JSON输出:

方式1:使用内置工具类序列化Map(推荐)

调用API网关映射模板内置的$util.mapToJson()方法,将Map对象直接序列化为标准JSON字符串后再做Base64编码,修改后的模板如下:

{
    #set($data = {
        "userid": $input.params('userid'),
        "firstname": $input.params('firstname'),
        "lastname": $input.params('lastname')
    })
    "StreamName": "xyz",
    "Data": "$util.base64Encode($util.mapToJson($data))",
    "PartitionKey": "0"
}

注意:Map中的参数值不需要额外包裹引号,mapToJson方法会自动处理字符串类型的引号添加和特殊字符转义,避免出现JSON格式错误。

方式2:直接构造JSON字符串

如果不使用内置序列化工具,也可以直接拼接标准JSON格式的字符串赋值给$data,注意字符串内部的双引号需要做转义处理:

{
    #set($data = "{\"userid\":\"$input.params('userid')\",\"firstname\":\"$input.params('firstname')\",\"lastname\":\"$input.params('lastname')\"}")
    "StreamName": "xyz",
    "Data": "$util.base64Encode($data)",
    "PartitionKey": "0"
}

两种方式最终传入Kinesis的Data字段解码后都是标准JSON格式,消费端Lambda可直接按JSON解析,不会再出现逗号分隔键值对的问题。优先选择第一种方式,代码可读性更高,也能避免手动拼接字符串带来的转义错误。

内容的提问来源于stack exchange,提问作者Mark Phillips

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:42:43