Python JSON模块不会解析我的Windows-1252字符串

时间:2015-05-15 22:07:51

标签: python json

我从服务器上获取了一些JSON数据,服务器说它是Windows-1252。所以我尝试使用该编码加载它,但得到ValueError: No JSON object could be decoded作为响应。我究竟做错了什么? (我意识到它与BOM有关,但这对我没有帮助。)

import json
my_data = u'\ufeff{"columns":[{"code":"Region","text":"region","type":"d"},{"code":"Tid","text":"\xe5r","type":"t"},{"code":"BE0101E2","text":"Levande f\xf6dda","type":"c"}],"comments":[],"data":[{"key":["0114","2014"],"values":["485"]}]}'

json.loads(my_data, encoding='Windows-1252')

1 个答案:

答案 0 :(得分:3)

您有一个 Unicode 对象,而不是CP-1252字节流。

解码失败,因为开始时有一个U+FEFF ZERO WIDTH NO-BREAK SPACE字符,可能会因使用Byte order mark解码数据而遗留下来。

如果删除数据,数据加载没有问题:

>>> import json
>>> my_data = u'\ufeff{"columns":[{"code":"Region","text":"region","type":"d"},{"code":"Tid","text":"\xe5r","type":"t"},{"code":"BE0101E2","text":"Levande f\xf6dda","type":"c"}],"comments":[],"data":[{"key":["0114","2014"],"values":["485"]}]}'
>>> json.loads(my_data[1:])
{u'data': [{u'values': [u'485'], u'key': [u'0114', u'2014']}], u'comments': [], u'columns': [{u'text': u'region', u'code': u'Region', u'type': u'd'}, {u'text': u'\xe5r', u'code': u'Tid', u'type': u't'}, {u'text': u'Levande f\xf6dda', u'code': u'BE0101E2', u'type': u'c'}]}

你可以有条件地删除它:

if my_data.startswith(u'\ufeff'):
    my_data = my_data[1:]

或使用正确的编解码器从字节解码数据;如果是UTF-8编码,您可以使用utf-8-sig解码并删除BOM。

json.loads()无法配置为加载utf-8-sig数据;它只是将其视为UTF-8并仍然在BOM上绊倒。在这种情况下,您可以先手动解码。