API Gateway调用DynamoDB触发SerializationException:非预期位置发现结构或映射起始符问题排查
问题分析与修复方案
哎,我一眼就看出你映射模板里的核心问题了——ExpressionAttributeNames的格式写错了,这和uuid是不是保留字完全没关系!
你现在的模板里,ExpressionAttributeNames把#id映射成了{"S": "uuid"},但这个字段的作用只是给表中的真实字段名起别名,不需要使用DynamoDB的AttributeValue结构(就是带S的那个对象)。DynamoDB期望这里是一个纯字符串,结果收到了一个嵌套结构,直接触发了SerializationException错误。
正确的映射模板
把ExpressionAttributeNames的部分改成纯字符串映射就行,其他部分保持不变:
{ "TableName": "table", "KeyConditionExpression": "#id = :v1", "ExpressionAttributeNames": { "#id": "uuid" }, "ExpressionAttributeValues": { ":v1": { "S": "$input.params('id')" } } }
为什么这样改?
ExpressionAttributeNames:仅仅是字段名的别名映射,用来规避字段名和DynamoDB保留字冲突,只需要直接写真实字段名的字符串即可,不需要指定数据类型。ExpressionAttributeValues:这个部分才需要用AttributeValue结构(比如{"S": "xxx"}),因为要明确传递给DynamoDB的参数类型和值,你的这部分写法是正确的。
你之前排除IAM权限的思路是对的,其他GET方法正常也说明API Gateway的基础配置没问题,就是这个模板的格式错误导致的序列化失败。
内容的提问来源于stack exchange,提问作者Grace
相关产品推荐
相关产品推荐

