在Python中用代碼:
|
1
2
|
cfgFile
=
open
(
'config.json'
,
'r'
);
jsonCfg
=
json.load(cfgFile);
|
解析json,對應的config.json如下:
| [ [password,123] ] |
但是結果出現“No JSON object could be decoded”錯誤:
| LINE 2684 : ERROR Unknown Error ! 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,心情棲息地]
結果都還是同樣的錯誤。
然后又試了可用的示例:
| { "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格式”
【總結】
Python中的Json庫去解析對應的字符串的時候,即使是你保證了json字符串(或文件)是UTF-8,那么也未必就可以正確解碼的,因為如果是在Windows下,那么默認是帶BOM的UTF-8,此時Json庫也是無法識別對應字符串的。
只有確保為無BOM的Json字符串,Python中的Json庫,才可以正確解析的。
圖說即為:
【相關解釋:默認的帶BOM的UTF-8 和 無BOM的UTF-8的區別】
默認的UTF-8,是帶BOM的,至少此處Notepad++的設置是這樣的。
此處的代碼,如果轉為UTF-8。默認是帶BOM的,即0xEF 0xBB 0xBF的:
而對應的無BOM的UTF-8的是不帶0xEF 0xBB 0xBF的:
其中,windows下,對於UTF-8編碼,一般默認都是帶BOM的,所以開頭會有個0xEF 0xBB 0xBF的。這點需要額外注意的。




