python 无法加载使用 utf-8 编码的 json 文件

python unable to load a json file with utf-8 encoding

使用以下 python 代码:

filePath = urllib2.urlopen('xx.json')
fileJSON = json.loads(filePath.read().decode('utf-8'))

xx.json 看起来像:

{
    "tags": [{
        "id": "123",
        "name": "Airport",
        "name_en": "Airport",
        "name_cn": "机场",
        "display": false
    }]
}

我看到以下异常:

fileJSON = json.loads(filePath.read().decode('utf-8'))
    File "/usr/lib64/python2.7/json/__init__.py", line 339, in loads
        return _default_decoder.decode(s)
    File "/usr/lib64/python2.7/json/decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
    File "/usr/lib64/python2.7/json/decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
    ValueError: No JSON object could be decoded

代码在汉字被添加到 json 文件之前工作,当时我还在 read() 后面添加了 .decode('utf-8') 。

我不确定需要做什么?

$ wget https://s3.amazonaws.com/wherego-sims/tags.json 
$ file tags.json 
tags.json: UTF-8 Unicode (with BOM) text, with CRLF line terminators

此文件以字节顺序标记 (EF BB BF) 开头,这在 JSON (JSON Specification and usage of BOM/charset-encoding) 中是非法的。您必须首先使用 Python 中的 'utf-8-sig' 对其进行解码以获得有效的 JSON unicode 字符串。

json.loads(filePath.read().decode('utf-8-sig'))

对于它的价值,Python 3(你应该使用它)在这种情况下会给出一个特定的错误并指导你处理这个格式错误的文件:

json.decoder.JSONDecodeError: Unexpected UTF-8 BOM (decode using utf-8-sig): line 1 column 1 (char 0)

也就是说,通过指定您希望丢弃 BOM(如果它存在)(同样,在 UTF-8 中使用它是不常见的,特别是 JSON,它总是以 UTF-8 编码,所以它比没用还糟):

>>> import json
>>> json.load(open('tags.json', encoding='utf-8-sig'))