2013-03-05 74 views
1

我寫了一個名爲kommscache.json的JSON對象(由其他人生成,代碼中我無法訪問),現在我試圖在Python中再次讀取它。我的JSON對象有什麼問題?

這是我做的:

import json 
from pprint import pprint 

with open('kommscache.json') as data_file: 
    data = json.load(data_file) 

pprint(data) 

在調用json.load(),我收到以下錯誤信息:

Traceback (most recent call last): 
    File "./kladd.py", line 7, in <module> 
    data = json.load(data_file) 
    File "/usr/lib/python2.7/json/__init__.py", line 280, in load 
    **kw) 
    File "/usr/lib/python2.7/json/__init__.py", line 328, in loads 
    return _default_decoder.decode(s) 
    File "/usr/lib/python2.7/json/decoder.py", line 365, in decode 
    obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
    File "/usr/lib/python2.7/json/decoder.py", line 381, in raw_decode 
    obj, end = self.scan_once(s, idx) 
ValueError: Expecting property name: line 1 column 1 (char 1) 

第一個JSON文件看起來像這樣的幾行(我已經試過非prettyprinted版本太多,結果相同):

{u'filtered': 458, 
u'items': [{u'comment_count': 0, 
      u'current_revision': {u'created_by': {u'avatar': 19435601, 

Unfortunatel Ÿ我無法向您顯示整個文件,因爲它包含一些敏感數據(並且它的長度超過6000行...),但是如果我正確讀取錯誤消息,則錯誤已在文件的開頭。但是,我看不出爲什麼這個JSON語法不正確。我已經仔細檢查過,並且此代碼段中的所有大括號和括號都與關閉的大括號相匹配。

爲什麼我無法加載這個JSON對象?

+1

不知道JSON,但你看起來很腥。 – 2013-03-05 13:23:58

+1

@JensSchauder:那些是Python unicode字符串文字。 'u'''創建一個unicode字符串,而'''創建一個字節字符串。這是Python,而不是JSON。 – 2013-03-05 13:25:54

回答

2

這不是一個JSON文件。它似乎是通過簡單編寫Python字典的字符串版本創建的文件。雖然格式相似,但它們並不相同。

您應該顯示創建該文件的代碼。您需要使用json.dump(data)而不是簡單地撥打str()

+0

謝謝!我只是在執行'pprint(myobj)'並將輸出管道輸出到一個文件,但是改成'print json.dumps(myobj)'解決了這個問題。 – 2013-03-05 13:55:31

3

您保存了python對象的文字表示,而不是 JSON。

您可以使用ast.literal_eval()來解碼那些人,但是您可能需要修復您的JSON編寫代碼。確保在保存時在結構上使用json.dumps()

使用ast.literal_eval()(後關閉所有的大括號):

>>> import ast 
>>> ast.literal_eval('''\ 
... {u'filtered': 458, 
... u'items': [{u'comment_count': 0, 
...    u'current_revision': {u'created_by': {u'avatar': 19435601, 
... }}}]}''') 
{u'filtered': 458, u'items': [{u'comment_count': 0, u'current_revision': {u'created_by': {u'avatar': 19435601}}}]} 
+0

不要讓他得到這樣的想法... – 2013-03-05 13:35:20

+0

@MarkusUnterwaditzer:爲什麼不呢? 'ast.literal_eval()'是完全安全的。它的表現不如JSON反序列化,但沒有安全風險。像JSON一樣,只支持原始python類型。它甚至會支持數字鍵(JSON不支持)。 – 2013-03-05 13:36:32

+0

這不是我的觀點。我只是認爲將它用於數據序列化是一個糟糕的主意。 – 2013-03-05 13:39:19