2015-01-08 103 views
0

我想在python中加載json文件。我的json文件如下所示:在python中加載json文件

{'awesomeness': 2.5, 'party': 'Republican', 'Age': 50, 'State': 'California', 'Ideology': 0.5, 
'time': {'day': 20, 'mon': 2, 'sec': 3}, 'overall': 9.5, 'review': 'Best Senator ever\tPretty balanced 
view.\tNot sure if he can get reelected'} 
{'awesomeness': 0.5, 'party': 'Republican', 'Age': 70, 'State': 'New York', 'Ideology': 0.8, 
'time': {'day': 25, 'mon': 8, 'sec': 31}, 'overall': 5.5, 'review': 'NA'} 

這是我的代碼。

with open("senator.json") as json_file: 
    data = json.load(json_file) 

,但我得到以下錯誤,

File "<stdin>", line 1, in <module> 
File "<string>", line 2, in <module> 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 290, in load 
**kw) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads 
return _default_decoder.decode(s) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode 
obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/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 2 (char 1) 

爲什麼我得到這個錯誤,我怎麼能加載此文件?謝謝你的幫助!

+1

這可能與您的JSON在單引號中有關。有效的JSON帶有雙引號。嘗試通過美化你的JSON(http://jsonformatter.curiousconcept.com/),如果它返回錯誤,那麼你的問題。 – Jordan

+0

也在這裏標記解決方案。如果你想讓你的文件成爲json,你可以使用ast.literal_eval來加載一次,然後將json.dumps(value)再次加入到文件中,使其成爲有效的JSON。 literal_eval不應該用來加載像這樣的字符串,所以請自己幫忙併將其轉換 - 它將爲您節省頭痛 – Jordan

回答

0

JSON字符串由雙引號分隔,而不是單個。您的輸入不是真正的JSON。

+0

問題的第二部分如何? – alecxe

+0

您可以(a)通過編輯或「sed」或任何方式將文件更改爲使用真正的JSON格式,在這種情況下,您當前的代碼將起作用;或者(b)您可以將當前文件讀入Python字符串,並使用'replace'將單引號更改爲double(注意轉義的嵌入式單引號),然後使用'json.loads'從該更改的字符串中加載。 –

1

您的JSON文件不是正確的JSON格式...我認爲這應該是這樣的

{'awesomeness': 2.5, 'party': 'Republican', 'Age': 50, 'State': 'California', 'Ideology': 0.5,'time': {'day': 20, 'mon': 2, 'sec': 3}, 'overall': 9.5, 'review': 'Best Senator ever\tPretty balanced w.\tNot sure if he can get reelected','awesomeness': 0.5, 'party': 'Republican', 'Age': 70, 'State': 'New York', 'Ideology': 0.8,'time': {'day': 25, 'mon': 8, 'sec': 31}, 'overall': 5.5, 'review': 'NA'}

而且你應該閱讀file.Syntax讀的是

with open("senator.json","r") as json_file: 
    data = json.load(json_file) 
+0

這不是有效的JSON。有效的JSON帶有雙引號。 – Jordan

4

正如其他人已經指出的,你的JSON是非法的。這就是爲什麼Python JSON解析器如果平坦下來。您的JSON應該是這樣的:

[ 
    { 
    "awesomeness": 2.5, 
    "party": "Republican", 
    "Age": 50, 
    "State": "California", 
    "Ideology": 0.5, 
    "time": { 
     "day": 20, 
     "mon": 2, 
     "sec": 3 
    }, 
    "overall": 9.5, 
    "review": "Best Senator ever \t Pretty balanced view. \t Not sure if he can get reelected" 
    }, 
    { 
    "awesomeness": 0.5, 
    "party": "Republican", 
    "Age": 70, 
    "State": "NewYork", 
    "Ideology": 0.8, 
    "time": { 
     "day": 25, 
     "mon": 8, 
     "sec": 31 
    }, 
    "overall": 5.5, 
    "review": "NA" 
    } 
] 

通知的字符串,而不是單引號的雙引號(這是非法的,表示裏面JSON字符串),並在方括號包裹你的兩個對象{...}所以它們的內array

後者是需要的,因爲JSON是等級。您發佈的JSON代碼僅包含兩個並排的對象,沒有任何外部結構。在這種情況下,如果您因此關閉方括號(無數組),那麼JSON解析器將在第一個對象後突然遇到逗號,,實際上它預期爲EOF

現在,如果你嘗試再次運行代碼:

with open('senator.json', 'r') as json_file: 
    data = json.load(json_file) 

你應該能夠讀取該文件沒有任何錯誤。

0

我發現了另一種處理這種單引號問題的方法。我用for循環和eval來讀取這個文件。

這是我使用的代碼。

def getdata(file): 
    for l in open(file): 
    yield eval(l) 

thedata = list(getdata('filename.json') 

感謝大家讓我知道這個問題!

+1

請確認'eval'是** evil **。對於應該在JSON本身(或生成JSON的代碼)中應該修復的問題,這聽起來像是一種醜陋和*危險的解決方法。你永遠不知道你現在盲目執行的JSON文件中究竟隱藏着哪些任意的Python代碼...... – Timusan