Python Dynamodb返回项的节点或字符串格式错误
我一直在AWS中试验DynamoDB,并认为它对我来说是错误的工具。在AWS中工作时,我向系统上传了大量记录,我现在正试图使用Python检索这些记录。我承认,我对Python完全是新手,我所拼凑的是从互联网上找到的示例。我正在使用Office 365审核日志,这些日志包含许多字段,当我从Dynamo检索它们时,我发现十进制字段返回为Python Dynamodb返回项的节点或字符串格式错误,python,python-3.x,amazon-web-services,amazon-dynamodb,Python,Python 3.x,Amazon Web Services,Amazon Dynamodb,我一直在AWS中试验DynamoDB,并认为它对我来说是错误的工具。在AWS中工作时,我向系统上传了大量记录,我现在正试图使用Python检索这些记录。我承认,我对Python完全是新手,我所拼凑的是从互联网上找到的示例。我正在使用Office 365审核日志,这些日志包含许多字段,当我从Dynamo检索它们时,我发现十进制字段返回为decimal('1') 在疑难解答中,我发现了这个方便的函数,它可以将十进制('0')转换为实际的十进制 class DecimalEncoder(json.JS
decimal('1')
在疑难解答中,我发现了这个方便的函数,它可以将十进制('0')转换为实际的十进制
class DecimalEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, decimal.Decimal):
if o % 1 > 0:
return float(o)
else:
return int(o)
return super(DecimalEncoder, self).default(o)
这个函数叫做
response = table.scan(Limit=10)
for i in response['Items']:
d = ast.literal_eval((json.dumps(i, cls=DecimalEncoder)))
在大多数情况下,这很好,除非我有一个布尔字段(如上面的示例)。然后我得到了这个错误
malformed node or string: <_ast.Name object at 0x04B3F778>
我确实找到了钥匙,但没有出错
if 'CustomUniqueId' in i:
del i['CustomUniqueId']
但是,我不想失去这个领域。我不知道如何解决这个问题。问题是您正在将Python对象转换为JSON字符串(即
JSON.dumps
命令),然后尝试将该字符串解释为Python字典(ast.literal\u eval
获取一个字符串并尝试将其作为Python代码运行)
python字典看起来非常类似于JSON对象,但它们不是100%兼容的。在JSON中,布尔值表示为true
和false
,在Python中表示为true
和false
解决这个问题的方法是使用json.loads
,它读取json字符串并将其转换为Python等价物:
d = json.loads((json.dumps(i, cls=DecimalEncoder)))
话虽如此,将Decimal类转换为本机浮点数似乎需要很多技巧/处理,如果需要将它们传递给需要浮点数的对象,建议直接使用Decimal或转换为浮点数(即
float(d['RecordType'))
。是否可以添加type(o)
要检查CustomUniqueId的确切类型?@HoratiuJeflea,当我调用print(type(I['CustomUniqueId'))
我的意思是在DecimalEncoder中,oThanks。我最终以一种稍微不同的方式解决了这个问题。我只是使用了eval函数s=json.dumps(i,cls=DecimalEncoder)
d=eval(s)
if 'CustomUniqueId' in i:
del i['CustomUniqueId']
d = json.loads((json.dumps(i, cls=DecimalEncoder)))