ValueError: malformed string using ast.literal_eval
ValueError: malformed string using ast.literal_eval
我正在循环获取 json api,这是我循环中的内容:
response_item = requests.request('GET',url_item,params=None,verify=False)
response_item = json.loads(response_item.text)
response_item = ast.literal_eval(json.dumps(response_item, ensure_ascii=False).encode('utf8'))
我扫描了大约 45000 个 json 对象,我为每次迭代生成 "url_item" 变量。每个对象都是一样的,我可以得到类似 7000 个对象的东西,当我到达第 7064 个时出现以下错误:
Traceback (most recent call last):
File "C:\Python27\tools\api_item.py", line 47, in <module>
response_item = ast.literal_eval(json.dumps(response_item, ensure_ascii=False).encode('utf8'))
File "C:\Python27\lib\ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "C:\Python27\lib\ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "C:\Python27\lib\ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "C:\Python27\lib\ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "C:\Python27\lib\ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "C:\Python27\lib\ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
我曾经打印过第二个和第三个"response_item"。当然,在这种情况下,不会显示第三个,因为我之前有错误,这里是 json.load:
之后的打印内容
{u'restrictions': [], u'name': u'Sac \xe0 dos de base', u'level': 0, u'rarity': u'Basic', u'vendor_value': 11, u'details': {u'no_sell_or_sort': False, u'size': 20}, u'game_types': [u'Activity', u'Wvw', u'Dungeon', u'Pve'], u'flags': [u'NoSell', u'SoulbindOnAcquire', u'SoulBindOnUse'], u'icon': u'https://render.guildwars2.com/file/80E36806385691D4C0910817EF2A6C2006AEE353/61755.png', u'type': u'Bag', u'id': 8932, u'description': u'Un sac de 20 emplacements pour les personnages d\xe9butants.'}
我在这个之前得到的每一个都具有相同的类型,相同的格式,除了第 7064 个之外我没有任何错误!
感谢您的帮助!
您应该不对JSON数据使用ast.literal_eval()
。 JSON 和 Python 文字可能 看起来 是同一个东西,但它们非常不同。
在这种情况下,您的数据包含一个布尔标志,在 JSON 中设置为 false
。正确的 Python 布尔值使用 title-case,因此 False
:
>>> import json, ast
>>> s = '{"no_sell_or_sort": false, "size": 20}'
>>> json.loads(s)
{u'no_sell_or_sort': False, u'size': 20}
>>> ast.literal_eval(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
其他差异包括使用 null
而不是 None
,以及 Python 2 中的 Unicode 转义序列看起来像 普通(字节)字符串 ,在转义 non-BMP 代码点时使用 UTF-16 代理项。
使用 json.loads()
而不是 ast.literal_eval()
加载您的数据。它不仅可以很好地处理 JSON,而且 更快 .
在您的情况下,您似乎正在使用 json.dumps()
,然后尝试使用 ast.literal_eval()
再次加载数据。这一步不需要,你已经 Python object.
换句话说,行:
response_item = ast.literal_eval(json.dumps(response_item, ensure_ascii=False).encode('utf8'))
充其量是多余的,最坏的情况下是非常非常错误的。 Re-encoding response_item
到 JSON 字符串不会产生可以解释为 Python 文字的内容。
ast.literal_eval 如果您正在使用 SQL 注入是安全的。
因为当插入不需要的章程时,它会显示阻止注入的 Syntex 错误。
我正在循环获取 json api,这是我循环中的内容:
response_item = requests.request('GET',url_item,params=None,verify=False)
response_item = json.loads(response_item.text)
response_item = ast.literal_eval(json.dumps(response_item, ensure_ascii=False).encode('utf8'))
我扫描了大约 45000 个 json 对象,我为每次迭代生成 "url_item" 变量。每个对象都是一样的,我可以得到类似 7000 个对象的东西,当我到达第 7064 个时出现以下错误:
Traceback (most recent call last):
File "C:\Python27\tools\api_item.py", line 47, in <module>
response_item = ast.literal_eval(json.dumps(response_item, ensure_ascii=False).encode('utf8'))
File "C:\Python27\lib\ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "C:\Python27\lib\ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "C:\Python27\lib\ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "C:\Python27\lib\ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "C:\Python27\lib\ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "C:\Python27\lib\ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
我曾经打印过第二个和第三个"response_item"。当然,在这种情况下,不会显示第三个,因为我之前有错误,这里是 json.load:
之后的打印内容{u'restrictions': [], u'name': u'Sac \xe0 dos de base', u'level': 0, u'rarity': u'Basic', u'vendor_value': 11, u'details': {u'no_sell_or_sort': False, u'size': 20}, u'game_types': [u'Activity', u'Wvw', u'Dungeon', u'Pve'], u'flags': [u'NoSell', u'SoulbindOnAcquire', u'SoulBindOnUse'], u'icon': u'https://render.guildwars2.com/file/80E36806385691D4C0910817EF2A6C2006AEE353/61755.png', u'type': u'Bag', u'id': 8932, u'description': u'Un sac de 20 emplacements pour les personnages d\xe9butants.'}
我在这个之前得到的每一个都具有相同的类型,相同的格式,除了第 7064 个之外我没有任何错误!
感谢您的帮助!
您应该不对JSON数据使用ast.literal_eval()
。 JSON 和 Python 文字可能 看起来 是同一个东西,但它们非常不同。
在这种情况下,您的数据包含一个布尔标志,在 JSON 中设置为 false
。正确的 Python 布尔值使用 title-case,因此 False
:
>>> import json, ast
>>> s = '{"no_sell_or_sort": false, "size": 20}'
>>> json.loads(s)
{u'no_sell_or_sort': False, u'size': 20}
>>> ast.literal_eval(s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
其他差异包括使用 null
而不是 None
,以及 Python 2 中的 Unicode 转义序列看起来像 普通(字节)字符串 ,在转义 non-BMP 代码点时使用 UTF-16 代理项。
使用 json.loads()
而不是 ast.literal_eval()
加载您的数据。它不仅可以很好地处理 JSON,而且 更快 .
在您的情况下,您似乎正在使用 json.dumps()
,然后尝试使用 ast.literal_eval()
再次加载数据。这一步不需要,你已经 Python object.
换句话说,行:
response_item = ast.literal_eval(json.dumps(response_item, ensure_ascii=False).encode('utf8'))
充其量是多余的,最坏的情况下是非常非常错误的。 Re-encoding response_item
到 JSON 字符串不会产生可以解释为 Python 文字的内容。
ast.literal_eval 如果您正在使用 SQL 注入是安全的。 因为当插入不需要的章程时,它会显示阻止注入的 Syntex 错误。