AWS API Gateway直存JSON到DynamoDB时保留结构并解决引号丢失问题
问题原因
- 你当前使用
$input.path('$.lesson')获取到的是VTL上下文中的Java Map类型对象,直接调用$util.escapeJavaScript处理时会默认执行Map的toString()方法,输出{key=value}格式的非标准JSON内容,导致存储后无法解析。
解决方案
你可以根据需求选择以下两种实现方式:
方案1:保留lesson为JSON字符串存储(S类型)
将映射模板中$input.path('$.lesson')替换为$input.json('$.lesson')即可,$input.json()方法会直接返回指定路径的标准JSON字符串片段,无需额外序列化。
修改后的完整映射模板如下:
application/json: "{\"TableName\":\"Lessons\",\"Item\":{\"id\":{\"S\":\"$input.path('$.studentHistoryId')\"},\"lesson\":{\"S\":\"$util.escapeJavaScript($input.json('$.lesson'))\"}}}"
修改后存储的lesson字段为带双引号的标准JSON格式,读取后可直接解析使用。
方案2:存储为DynamoDB原生嵌套结构(M类型)
如果后续需要直接编辑lesson内部的字段,更推荐直接存为DynamoDB的Map(M)类型,无需序列化/反序列化整个字段即可直接操作内部属性,映射模板如下:
application/json: { "TableName": "Lessons", "Item": { "id": { "S": "$input.path('$.studentHistoryId')" }, "lesson": { "M": $input.json('$.lesson') } } }
该方式会保留lesson内部所有字段的原始类型,你可以直接通过DynamoDB API更新lesson.ok great.further test这类嵌套属性,无需修改整个lesson字段。
内容的提问来源于stack exchange,提问作者Zachary Sedefian
相关产品推荐
相关产品推荐

