boto3 从 dynamodb 查询结果中删除 Decimal() 表示法 - python

问题描述 投票:0回答:2

所以我正在使用

boto3
,尝试从
dynamoDB
表中检索一些数据,并且返回给我的每个数字都使用这种 Decimal(..) 表示法,而不是获取

{
 "itemId" : 123
}
I get
{
 "itemId": Decimal(123)
}

有没有办法删除它,而不必为它写一个

regExp

我是用 for 手动完成的,例如使用

int(itemId)
,它适用于某些项目,但这些是非常大且复杂的对象,并不总是具有相同的结构和键名,所以我不能做所有的事情像这样。

python amazon-dynamodb boto3
2个回答
1
投票

对于我来说,我创建了一个 DecimalEncoder 类,并在需要时用它来解析我的数据。这是一个例子:

import boto3
import json
import decimal

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('MyTable')
class DecimalEncoder(json.JSONEncoder):
    """
    Helper class to convert a DynamoDB item to JSON.
    """
    def default(self, o):  # pylint: disable=E0202
        if isinstance(o, decimal.Decimal):
            if abs(o) % 1 > 0:
                return float(o)
            return int(o)
        return super(DecimalEncoder, self).default(o)


def getitem():
    ddbresponse = table.get_item(
        Key={'pk': 'a', 'sk': 'b'},
        ConsistentRead=True
    )
    return json.dumps(ddbresponse['Item'], cls=DecimalEncoder) if 'Item' in ddbresponse else ddbresponse

print(getitem())

DynamoDB 不知道数字实际上是什么数据类型,这导致 python 将其表示为十进制。


0
投票

您可以使用

dynamodb-json
中的 json_util。它是一个实用程序,可以将 JSON 转换为 DynamoDB 格式进行存储,也可以从 dynamoDB 格式转换为常规 JSON,并正确地将数字转换为其各自的类型。 使用 pip 安装:

pip install dynamodb-json

导入:

from dynamodb_json import json_util

然后像使用

json.loads
一样使用它,只需使用
json_util.loads(data)

© www.soinside.com 2019 - 2024. All rights reserved.