Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dynamodb返回项的节点或字符串格式错误_Python_Python 3.x_Amazon Web Services_Amazon Dynamodb - Fatal编程技术网

Python Dynamodb返回项的节点或字符串格式错误

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

我一直在AWS中试验DynamoDB,并认为它对我来说是错误的工具。在AWS中工作时,我向系统上传了大量记录,我现在正试图使用Python检索这些记录。我承认,我对Python完全是新手,我所拼凑的是从互联网上找到的示例。我正在使用Office 365审核日志,这些日志包含许多字段,当我从Dynamo检索它们时,我发现十进制字段返回为
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)))