如何转换AWS DynamoDB带类型标记数据?Boto3是否有原生方法?
DynamoDB带类型标记数据的转换方法
首先明确:Boto3确实提供了原生方法来处理这种带类型标记的DynamoDB数据转换,无需手动从头实现复杂逻辑。
一、Boto3原生转换方案
使用boto3.dynamodb.types.TypeDeserializer类的deserialize方法,它专门用于将DynamoDB的原生格式(带类型标记的结构)转换为Python原生数据类型。
代码示例
import boto3 from boto3.dynamodb.types import TypeDeserializer # 原始DynamoDB带类型标记的数据 dynamodb_raw_data = { "a": { "S": "AAAA" }, "myList": { "L": [ { "S": "T1" }, { "S": "T2" }, { "S": "TH" } ] }, "checkList": { "L": [ { "M": { "id": { "S": "telesurveyor" }, "check": { "BOOL": True } } } ] }, "createdAt": { "N": "1672842152365" } } # 初始化反序列化器 deserializer = TypeDeserializer() # 遍历Item的每个键值对完成转换 parsed_data = {key: deserializer.deserialize(value) for key, value in dynamodb_raw_data.items()} print(parsed_data)
执行后会直接输出你需要的无类型标记的干净数据结构。
二、手动实现方案(不依赖Boto3类型工具)
如果场景特殊,需要自己实现解析逻辑,可以写一个递归函数处理DynamoDB的常见类型(S字符串、N数字、BOOL布尔、L列表、M嵌套对象):
代码示例
def parse_dynamodb_item(item): if isinstance(item, dict): # 处理单个类型标记的字段(如{"S": "xxx"}) if len(item) == 1: type_key, value = next(iter(item.items())) match type_key: case 'S': return value case 'N': # 优先转整数,失败则转浮点数 try: return int(value) except ValueError: return float(value) case 'BOOL': return value case 'L': # 递归解析列表中的每个元素 return [parse_dynamodb_item(elem) for elem in value] case 'M': # 递归解析嵌套对象 return {k: parse_dynamodb_item(v) for k, v in value.items()} # 直接处理嵌套的对象结构 else: return {k: parse_dynamodb_item(v) for k, v in item.items()} # 非字典类型直接返回 return item # 调用解析函数 parsed_data = parse_dynamodb_item(dynamodb_raw_data) print(parsed_data)
这个函数会递归处理所有层级的嵌套结构,输出符合要求的原生数据格式。
内容的提问来源于stack exchange,提问作者Utopion
相关产品推荐
相关产品推荐

