Python中解析Json文件出錯:ValueError : No JSON object could be decoded –> Python中Json庫不支持帶BOM的UTF-8


在Python中用代碼:

?
1
2
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的。這點需要額外注意的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM