值错误:使用ast.literal的字符串格式不正确_

2024-04-25 09:56:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在执行一个循环以获取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

我曾经打印第二个和第三个“响应项”。当然,在本例中,第三个不会显示,因为我之前有错误,这里是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!

谢谢你的帮助!


Tags: inpynodejsonfalseconvertresponselib
2条回答

如果使用此方法,则ast.literal_eval在使用SQL注入时是安全的。 因为当插入一个不需要的charter时,它将显示Syntex错误,从而防止注入。

您不应该对JSON数据使用ast.literal_eval()。JSON和Python文本看起来可能与eem类似,但它们不是很像。

在本例中,您的数据包含一个布尔标志,在JSON中设置为false。正确的Python布尔值使用标题大小写,因此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转义序列看起来像一个普通(字节)字符串,在转义非BMP代码点时使用UTF-16代理。

json.loads()加载数据,而不是ast.literal_eval()。它不仅可以很好地处理适当的JSON,而且可以更快地处理。

在您的例子中,似乎您正在使用json.dumps(),然后尝试使用ast.literal_eval()再次加载数据。对于该步骤,您已经有了一个Python对象。

换句话说,这句话:

response_item = ast.literal_eval(json.dumps(response_item, ensure_ascii=False).encode('utf8'))

充其量是多余的,最坏的情况是非常非常错误的。将response_item重新编码为JSON字符串不会产生可解释为Python文本的内容。

相关问题 更多 >