2016-03-14 38 views
0

我從數據庫中提取json格式的文本。基本上將api內容從網站轉儲到帶有TEXT字段的數據庫。無法解析json內容,錯誤爲`expect enclosed property name enclosed'

我可以看到JSON內容沒有問題/錯誤,但是當我做..

try: 
    get_all = db.query("SELECT id, name, api_content FROM _books") 
    _result = get_all.fetchall() 
except Exception as e: 
    print("[e::line-163] ", e) 

try: 
    for r in _result: 
     api_content = r[2] 
     j = json.loads(api_content) 
     print('names, ', j['names']) 

我得到這個錯誤。

期待屬性名稱包括在雙引號:第1行第2列(CHAR 1)

api_content沒有問題,這是一個結構良好的JSON內容。

回答

1

我不認爲你在api_content有一個有效的JSON。根據錯誤的內容來判斷,你的屬性(鍵)用單引號引起來,但是需要用雙引號括起來纔是有效的JSON。

這裏是正在發生的事情:

>>> import json 
>>> json.loads('{"key": "value"}') # <- VALID JSON 
{'key': 'value'} 
>>> json.loads("{'key': 'value'}") # <- INVALID JSON 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads 
    return _default_decoder.decode(s) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 355, in raw_decode 
    obj, end = self.scan_once(s, idx) 
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1) 

換句話說,你應該修改你轉儲API內容到數據庫的方式。看起來你只是寫了Python字典對象的字符串表示,而不是使用json.dumps()

如果你不能改變這種狀況,嘗試使用ast.literal_eval()安全EVAL API的內容:

from ast import literal_eval 

for r in _result: 
    api_content = r[2] 
    j = literal_eval(api_content) 
    print('names, ', j['names']) 
+0

我想這可能是它,我只是分貝,一切都在單引號。有沒有辦法解決這個問題? –

+0

@ soni-b3196413我會修改/修復你將api內容轉儲到數據庫(json.dump(s))的方式。如果你不能改變它,你可以嘗試通過['ast.literal_eval()'](https://docs.python.org/3/library/ast.html#ast.literal_eval)加載api內容。 – alecxe

+0

所以,你說在將'api_content'提交給數據庫之前,有一種方法可以使用'json.dump'修復引號?如果是這樣的話,那會更好,因爲我將嘗試替換字符串..這將是很多工作。你能舉一個例子嗎?對不起,我在python中爲0 –