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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:30:10