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

如何在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状态实现:

  1. 先把Item转成键值对数组:
    在DynamoGetItem的resultSelector中添加:
resultSelector: {
  "itemEntries.$": "States.ObjectToEntries($.Item)"
}

这会把Item转换为类似[["pk", {"S":"user-123"}], ["sk", {"S":"signup"}]]的数组格式。

  1. 添加Map状态处理数组:
    配置Map状态的ItemProcessor,对每个条目提取键和对应的值(这里假设都是字符串类型S,如果有其他类型可添加判断逻辑):
{
  "Key.$": "$[0]",
  "Value.$": "$[1].S"
}
  1. 把处理后的数组转回对象:
    在Map状态的输出阶段,用States.EntriesToObject合并结果:
resultSelector: {
  "body": {
    "res.$": "States.EntriesToObject($.itemEntries)"
  }
}

这种方式无需提前知道所有字段名,能适配字段动态变化的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 21:37:46