2017-10-21 113 views
-2

我試圖解碼一些JSON使用Python 3. json庫時引起「期望值......」錯誤:datetime.datetimes在JSON是導致「期待值」的錯誤在Python

>>> import json 
>>> json.loads("datetime.datetime(2017, 1, 1, 0, 0, 0, 0)") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\Jack\AppData\Local\Programs\Python\Python35\lib\json\__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
    File "C:\Users\Jack\AppData\Local\Programs\Python\Python35\lib\json\decoder.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "C:\Users\Jack\AppData\Local\Programs\Python\Python35\lib\json\decoder.py", line 357, in raw_decode 
    raise JSONDecodeError("Expecting value", s, err.value) from None 
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 

使用object_hook在這裏似乎沒有幫助,我嘗試添加一個,但它甚至沒有被調用。這是怎麼回事?

+1

是什麼讓你認爲這是有效的JSON? –

+0

你究竟想在這裏做什麼?正如Martijn所說 - 這不是JSON - 但我想知道你是否試圖創建一個例子在這裏發佈,也許簡化它有點誤導你可能實際上試圖實現... –

+0

@MartijnPieters它出現在我從API獲得的一些JSON中。我一開始也很驚訝,但後來我發現了很多類似的使用datetime和JSON的python問題,我認爲這只是我沒有意識到的一些JSON特性。 –

回答

2

json.loads()只接受有效的JSON數據。您沒有有效的JSON。你不能把Python對象名稱放在那裏。

對象掛鉤僅適用於{....}JSON對象。術語對象這裏沒有擴展到Python定義。

如果你想把日期時間值放到JSON中,你需要想出不同的方案。 JSON沒有任何本地支持;通常特定的API只是記錄了什麼值應該是日期時間值,在讀取JSON數據時,您在應用程序級別處理日期,而不是在解碼級別。

如果您發現"datetime.datetime(2017, 1, 1, 0, 0, 0, 0)"字符串在JSON文檔中,那麼就JSON解析器而言,這些只是字符串。字符串的內容不被處理,這取決於應用程序層要做的事情。

如果這些字符串是一個JSON對象({"key": "datetime.datetime(...)", ...})內的值,那麼你可以使用object_hook回調來檢查所有這些價值觀,並與datetime情況下替換它們:

import datetime, re 

datetime_pat = re.compile(r'datetime\.datetime\([\d, ]+\)') 

def convert_datetime_values(d): 
    for key, value in d.items(): 
     if datetime.pat.match(value): 
      d[key] = eval(value) 
    return d 

你不能這樣做但對於JSON數組也是如此。

+0

我見過一些系統轉儲''datetime.datetime(...)「'作爲值 - 仍然不確定OP是否簡化了他們的問題太多,他們*處理JSON,但正在設法解決如何處理出現的問題。 –

+0

@JonClements:但那些仍然是字符串那麼應用層就必須解釋JSON庫沒有設施來解釋它們 –

+0

我知道:)我只是指出了問題的問題,顯示的問題不太可能是問題的實際意思問 - 但你已經在編輯中解決了這個問題:p –