所以我正在使用
boto3
,尝试从 dynamoDB
表中检索一些数据,并且返回给我的每个数字都使用这种 Decimal(..) 表示法,而不是获取
{
"itemId" : 123
}
I get
{
"itemId": Decimal(123)
}
有没有办法删除它,而不必为它写一个
regExp
?
我是用 for 手动完成的,例如使用
int(itemId)
,它适用于某些项目,但这些是非常大且复杂的对象,并不总是具有相同的结构和键名,所以我不能做所有的事情像这样。
对于我来说,我创建了一个 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 将其表示为十进制。
您可以使用
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)