2013-02-15 19 views
105

Python代碼從一些長期複雜化JSON文件加載數據更好的錯誤消息:顯示不是「無JSON對象可以被解碼」

with open(filename, "r") as f: 
    data = json.loads(f.read()) 

(注:最好的代碼版本應該是:

with open(filename, "r") as f: 
    data = json.load(f) 

但兩者表現出類似的行爲)

對於許多類型的JSON錯誤(丟失分隔符,在字符串不正確反斜線等),這個打印包含行和列n一個很好的有用信息發現JSON錯誤的地方。

然而,對於其他類型的JSON錯誤(包括經典的「在列表的最後一個項目用逗號」,而且其他像大寫真/假),Python的輸出只是:

Traceback (most recent call last): 
    File "myfile.py", line 8, in myfunction 
    config = json.loads(f.read()) 
    File "c:\python27\lib\json\__init__.py", line 326, in loads 
    return _default_decoder.decode(s) 
    File "c:\python27\lib\json\decoder.py", line 360, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "c:\python27\lib\json\decoder.py", line 378, in raw_decode 
    raise ValueError("No JSON object could be decoded") 
ValueError: No JSON object could be decoded 

對於這種類型的ValueError,你如何讓Python告訴你JSON文件中的錯誤在哪裏?

+0

你可以轉儲文件的摘錄嗎? – Ketouem 2013-02-15 16:56:09

+0

我不想在特定文件中找到錯誤;我正在嘗試修改我的程序,以便在未來的任何文件中突出顯示錯誤。 – OJW 2013-02-15 18:42:01

+2

沒有直接關係,但是您可以只使用'json.load(f)'而不是'json.loads(f.read())' – 2013-02-25 16:02:09

回答

143

我發現simplejson模塊在內置json模塊很模糊的很多情況下會給出更多的描述性錯誤。例如,對於在列表中的最後一項之後具有逗號的情況:

json.loads('[1,2,]') 
.... 
ValueError: No JSON object could be decoded 

這不是非常具有描述性。與simplejson相同操作:

simplejson.loads('[1,2,]') 
... 
simplejson.decoder.JSONDecodeError: Expecting object: line 1 column 5 (char 5) 

好多了!同樣適用於其他常見錯誤,如大寫True

+12

Python的未來版本將包含這些改進;這是下面的同一個項目。 – 2013-02-19 13:04:57

+2

http://stackoverflow.com/questions/718040/how-to-install-simplejson-package-for-python – OJW 2013-02-25 12:14:01

+0

我做了一個簡單的更改,讓它更加冗長是編輯'/usr/lib/python2.7/json/scanner.py',所以'make_scanner = py_make_scanner'而不是使它等於c_make_scanner。 – paulie4 2015-10-09 16:13:34

13

你將無法得到python告訴你JSON不正確的地方。您需要在某處使用linter,如this

這會向您顯示您嘗試解碼的JSON中的錯誤。

+2

是否有脫機工具可以爲機密JSON文件執行此操作? – OJW 2013-02-15 18:43:51

+0

@OJW不是我所知道的,但是這應該可以解決您遇到的問題,或者至少讓您修復破碎的json。 – myusuf3 2013-02-15 19:12:56

+9

我的JSON文件很好 - 我試圖讓我的程序打印有用的錯誤消息,這對任何人都是可以理解的。告訴他們「在第13行第32列消除逗號」是很好的。告訴他們「你的文件中有錯誤,請上傳到互聯網,人們會幫你」是不好的。 – OJW 2013-02-15 21:15:37

5

你可以試試在這裏找到的rson庫:http://code.google.com/p/rson/。我也在PYPI:https://pypi.python.org/pypi/rson/0.9,所以你可以使用easy_install或pip來獲得它。

由湯姆給出的例子:

>>> rson.loads('[1,2,]') 
... 
rson.base.tokenizer.RSONDecodeError: Unexpected trailing comma: line 1, column 6, text ']' 

RSON是一個設計爲JSON的超集,所以它可以解析JSON文件。它還有一個替代語法,很多更適合人類查看和編輯。我使用它很多輸入文件。

至於布爾值的大寫:看起來rson讀取不正確的大寫布爾值作爲字符串。

>>> rson.loads('[true,False]') 
[True, u'False'] 
-3

你可以使用cjson,聲稱要達到比純Python實現更快,因爲250倍,你有「一些長期複雜的JSON文件」,你可能會需要跑幾次(解碼器失敗並報告他們遇到的第一個錯誤)。

4

我有一個類似的問題,這是由於單引號。JSON標準(http://json.org)僅討論使用雙引號,因此它必須是python json庫僅支持雙引號。

2

對於我這個問題的特別版本,我繼續和packaging.py文件內搜索的load_json_file(path)函數聲明,然後偷運一個print線到它:

def load_json_file(path): 
    data = open(path, 'r').read() 
    print data 
    try: 
     return Bunch(json.loads(data)) 
    except ValueError, e: 
     raise MalformedJsonFileError('%s when reading "%s"' % (str(e), 
                   path)) 

這樣,它會打印的內容在進入try-catch之前的json文件,就這樣 - 即使我幾乎沒有Python知識 - 我能夠快速找出爲什麼我的配置無法讀取json文件。
(這是因爲我已經建立了我的文本編輯器編寫一個UTF-8 BOM ...愚蠢)

就提這個,因爲,雖然可能不是一個好答案OP的具體問題,這是一個相當快速的方法在確定一個非常壓抑的錯誤的來源。我敢打賭,很多人會偶然發現這篇文章,他們正在尋找一個更詳細的解決方案的MalformedJsonFileError: No JSON object could be decoded when reading …。所以這可能會幫助他們。

+0

你應該使用上下文管理器來處理文件I/O('with open(fn)as f'),它會爲你處理一個例外的文件。 https://en.wikibooks.org/wiki/Python_Programming/Context_Managers#Basic_resource_management – Rebs 2016-11-29 02:59:49

+0

+1。如果你可以展示一個例子,然後將它標準化到標準行爲上,那將是相當整潔的 – 2017-04-10 08:41:10

+0

對不起,在找出問題後,我從未觸及任何Python代碼。也許別人可以幫忙? – WoodrowShigeru 2017-04-13 15:55:59

2

我有一個類似的問題,這是我的代碼:

json_file=json.dumps(pyJson) 
    file = open("list.json",'w') 
    file.write(json_file) 

    json_file = open("list.json","r") 
    json_decoded = json.load(json_file) 
    print json_decoded 

的問題是我忘了file.close()我做到了,解決了這一問題。

+0

也爲我效勞,不知道爲什麼之前沒有這個問題。 – pceccon 2016-06-01 19:05:34

+0

您應該使用文件I/O的上下文管理器('open with(fn)as f'),它會爲您處理異常情況下的文件。 https://en.wikibooks.org/wiki/Python_Programming/Context_Managers#Basic_resource_management – Rebs 2016-11-29 02:58:59

相關問題