最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【已解决】Python中解析Json文件出错:ValueError : No JSON object could be decoded –> Python中Json库不支持带BOM的UTF-8

JSON crifan 16712浏览 0评论

【问题】

在Python中用代码:

cfgFile = open('config.json','r');
jsonCfg = json.load(cfgFile);

解析json,对应的config.json如下:

[

[username,心情栖息地],

[password,123]

]

但是结果出现“No JSON object could be decoded”错误:

LINE 2684 : ERROR Unknown Error !

Traceback (most recent call last):

File "D:\tmp\WordPress\Others\to_wp\BlogsToWordpress\HiBaiduToWordpress\HiBaiduToWordpress\HiBaiduToWordpress_v2012-03-12-office.py", line 2682, in <module>

main()

File "D:\tmp\WordPress\Others\to_wp\BlogsToWordpress\HiBaiduToWordpress\HiBaiduToWordpress\HiBaiduToWordpress_v2012-03-12-office.py", line 2497, in main

jsonCfg = json.load(cfgFile);

File "D:\tmp\WordPress\DevRoot\Python27\lib\json\__init__.py", line 278, in load

**kw)

File "D:\tmp\WordPress\DevRoot\Python27\lib\json\__init__.py", line 326, in loads

return _default_decoder.decode(s)

File "D:\tmp\WordPress\DevRoot\Python27\lib\json\decoder.py", line 366, in decode

obj, end = self.raw_decode(s, idx=_w(s, 0).end())

File "D:\tmp\WordPress\DevRoot\Python27\lib\json\decoder.py", line 384, in raw_decode

raise ValueError("No JSON object could be decoded")

ValueError: No JSON object could be decoded

【解决过程】

1.后来找了Python 2.7的手册看,函数的用法的对的啊,但是不知道为何此处错误,好像是json文件格式有问题。

2.网上找了下关于json的介绍资料:

http://zh.wikipedia.org/wiki/JSON

http://www.json.org/json-zh.html

然后去试了很多个:

{"username":"心情栖息地"}

[username,心情栖息地]

结果都还是同样的错误。

然后又试了可用的示例:

{

"firstName": "John",

"lastName": "Smith",

"male": true,

"age": 25,

"address":

{

"streetAddress": "21 2nd Street",

"city": "New York",

"state": "NY",

"postalCode": "10021"

},

"phoneNumber":

[

{

"type": "home",

"number": "212 555-1234"

},

{

"type": "fax",

"number": "646 555-4567"

}

]

}

结果还是不可以,那就说明此处代码有问题了。

3.网上找了N个关于此问题的解释,但是都没有解决我的问题。

4. 最后经过自己的折腾,经过N多次的尝试,终于解决了此问题:

此处的方法是,去config.json中,把此文本的编码,从之前的UTF-8转换为ANSI编码。

然后json.loads就可以识别,并转换为python对象了。

但是很是诡异的是,如果我没理解错的话,Python 2.7的手册中的:

If the contents of fp are encoded with an ASCII based encoding other than UTF-8 (e.g. latin-1), then an appropriate encoding name must be specified. Encodings that are not ASCII based (such as UCS-2) are not allowed, and should be wrapped with codecs.getreader(encoding)(fp), or simply decoded to a unicode object and passed to loads().

意思是,如果你的编码不是以ANSI为基础的UTF-8的话,那么是需要手动指定对应的encoding的。

但是我此处的编码,就是特意设置为了UTF-8结果还是无法解码的,最后是手动把UTF-8改为ANSI编码,才成功的解码的。

而且更加诡异的是,我去把json文件编码转换为UTF-8,然后代码中用:

jsonCfg = json.loads(cfgData, encoding="utf-8");

竟然还是无法解码,还是出现上述的错误。

刚刚才发现,原来即使把json文件转换为UTF-8编码的话,那也一定要转换为:

“无BOM的UTF-8格式”

转为UTF-8无BOM编码格式

【总结】

Python中的Json库去解析对应的字符串的时候,即使是你保证了json字符串(或文件)是UTF-8,那么也未必就可以正确解码的,因为如果是在Windows下,那么默认是带BOM的UTF-8,此时Json库也是无法识别对应字符串的。

只有确保为无BOM的Json字符串,Python中的Json库,才可以正确解析的。

图说即为:

json decode not support BOM utf-8

【相关解释:默认的带BOM的UTF-8 和 无BOM的UTF-8的区别】

默认的UTF-8,是带BOM的,至少此处Notepad++的设置是这样的。

此处的代码,如果转为UTF-8。默认是带BOM的,即0xEF 0xBB 0xBF的:

with BOM UTF-8

而对应的无BOM的UTF-8的是不带0xEF 0xBB 0xBF的:

no BOM utf-8

其中,windows下,对于UTF-8编码,一般默认都是带BOM的,所以开头会有个0xEF 0xBB 0xBF的。这点需要额外注意的。

转载请注明:在路上 » 【已解决】Python中解析Json文件出错:ValueError : No JSON object could be decoded –> Python中Json库不支持带BOM的UTF-8

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (5)

  1. 如何 :去config.json中,把此文本的编码,从之前的UTF-8转换为ANSI编码? 小白求教!!
    SSTFSI6年前 (2018-06-15)回复
    • 其实就是,文件的编码的转换。很多文本编辑器,比如Notepad++,VSCode等都有文件编码转换的功能。你去试试即可。
      crifan6年前 (2018-06-19)回复
      • header ={'content-type':'application/json'} jsonstr={"train_date":"2018-07-07","from_station":"SZ","to_station":"SH","purpose_codes":"ADULT","partnerid":"12306com","method":"train_query","reqtime":"20180703092001","sign":"a305f5a89cfeb993db8bd08c7ed2c06f"} r = requests.post('http://rapapi.org/mockjsdata/35542/search',data=jsonstr,headers=header) print(r.json()) 我的代码很简单,只有这些,也报了同样的错误,我用的是pycharm,请问您指的这个config.json是应该在我当前的工程目录下存在吗,还是?我找了电脑的该文件,只有jmeter安装目录里才有,是不是说明我的这个文件缺失呢,我把jmeter里的这个文件记事本打开了,保存成ASCII编码了,运行报错不变,我想我可能是配置错了,另外config.json文件我也打开看了,里面没有配置文件编码的地方,我估计我的思路都有问题,能否帮忙小白解答下,求救!
        Eileen5年前 (2018-12-05)回复
  2. 非常感谢,本人也遇到这个问题,简直让人费解,python的json模块做的有点差劲。
    679年前 (2015-07-07)回复
96 queries in 0.203 seconds, using 22.17MB memory