如何在Python中移除boto3查询DynamoDB结果的Decimal()标记?
解决DynamoDB返回Decimal类型的问题
下面是几种可行的处理方案,覆盖复杂结构的对象转换:
1. 递归遍历转换(最灵活可控)
自己实现递归函数,遍历整个对象的所有层级,自动把Decimal类型转为对应的int或float:
from decimal import Decimal def convert_decimals(obj): if isinstance(obj, Decimal): # 判断是否为整数,是则转int,否则转float return int(obj) if obj == int(obj) else float(obj) elif isinstance(obj, dict): return {key: convert_decimals(value) for key, value in obj.items()} elif isinstance(obj, list): return [convert_decimals(item) for item in obj] # 其他类型直接返回 return obj # 使用示例 raw_data = { "itemId": Decimal(123), "price": Decimal(29.99), "meta": { "stock": Decimal(100), "tags": ["sale", Decimal(5)] } } processed_data = convert_decimals(raw_data)
优点:完全自定义转换逻辑,不需要依赖第三方库,能处理任意嵌套结构。
2. 使用boto3内置TypeDeserializer(官方方案)
如果是通过boto3的client对象获取数据(返回的是DynamoDB原生格式,如{'N': '123'}),可以用官方的TypeDeserializer直接转换为原生Python类型:
import boto3 from boto3.dynamodb.types import TypeDeserializer dynamodb_client = boto3.client('dynamodb') response = dynamodb_client.scan(TableName='YourTableName') deserializer = TypeDeserializer() # 批量转换所有条目 processed_items = [] for item in response['Items']: processed_item = {k: deserializer.deserialize(v) for k, v in item.items()} processed_items.append(processed_item)
优点:官方原生支持,转换逻辑符合DynamoDB数据类型规范,不会出错。
3. 借助simplejson库快速转换
利用simplejson对Decimal的原生支持,一键完成转换:
首先安装依赖:
pip install simplejson
然后使用:
import simplejson as json # 先序列化为JSON字符串,再反序列化为Python对象,自动转换Decimal processed_data = json.loads(json.dumps(raw_data, use_decimal=True))
优点:代码量极少,适合快速实现;缺点:需要额外安装第三方库,转换逻辑不如递归函数灵活。
内容的提问来源于stack exchange,提问作者Foncho
相关产品推荐
相关产品推荐

