如何在Step Functions中用DynamoGetItem获取常规对象?
问题
我想在Step Functions中用DynamoGetItem获取常规格式的对象,但目前从DynamoDB拿到的数据带类型标记,格式如下:
{ "Item": { "sk": { "S": "signup" }, "pk": { "S": "user-123" }, "email": { "S": "foo@bar.com" } } // 其他头部数据... }
我用CDK配置的代码如下:
// id-lookup table const table = Table.fromTableName(this, 'redacted', 'redacted'); const getItem = new DynamoGetItem(this, 'GetItemStep', { table, key: { pk: DynamoAttributeValue.fromString(JsonPath.stringAt('$.body.req.id')), sk: DynamoAttributeValue.fromString('signup'), }, resultSelector: { body: { 'res.$': '$.Item', }, }, // outputPath: '$.Item', });
现在没法去掉那些{S: any}的类型包装,研究了很久JSONPath也不知道怎么保留键的同时拿到无类型的对象。不想用Lambda,希望只用Step Functions的任务或过滤器实现。
解决方案
方法1:固定字段场景 - 直接提取值
如果字段是固定的,直接在resultSelector里通过JSONPath深层提取每个字段的S值,构造干净的对象:
const getItem = new DynamoGetItem(this, 'GetItemStep', { table, key: { pk: DynamoAttributeValue.fromString(JsonPath.stringAt('$.body.req.id')), sk: DynamoAttributeValue.fromString('signup'), }, resultSelector: { body: { res: { 'pk.$': '$.Item.pk.S', 'sk.$': '$.Item.sk.S', 'email.$': '$.Item.email.S' } } }, });
输出的res会是不带类型包装的常规对象:
{ "body": { "res": { "pk": "user-123", "sk": "signup", "email": "foo@bar.com" } } }
方法2:动态字段场景 - 用Map状态遍历处理
如果字段不固定,需要遍历Item的所有键值对提取值,可以配合Step Functions的Map状态实现:
- 先把
Item转成键值对数组:
在DynamoGetItem的resultSelector中添加:
resultSelector: { "itemEntries.$": "States.ObjectToEntries($.Item)" }
这会把Item转换为类似[["pk", {"S":"user-123"}], ["sk", {"S":"signup"}]]的数组格式。
- 添加Map状态处理数组:
配置Map状态的ItemProcessor,对每个条目提取键和对应的值(这里假设都是字符串类型S,如果有其他类型可添加判断逻辑):
{ "Key.$": "$[0]", "Value.$": "$[1].S" }
- 把处理后的数组转回对象:
在Map状态的输出阶段,用States.EntriesToObject合并结果:
resultSelector: { "body": { "res.$": "States.EntriesToObject($.itemEntries)" } }
这种方式无需提前知道所有字段名,能适配字段动态变化的场景。
内容的提问来源于stack exchange,提问作者JonTroncoso
相关产品推荐
相关产品推荐

