2014-10-10 27 views
0

我是Python新手。我試圖解析url的json結果。本來,我用的是以下幾點:在解碼url中的json結果之後接收「KeyError」

response = urllib.request.urlopen(url) 
json_obj = json.load(response) 

這給了一個錯誤的線沿線的「JSON對象應該是‘海峽’而不是‘字節’」,因此,在計算器搜索後,我解碼的迴應如下:

f = urllib.request.urlopen(url) 
charset = f.info().get_param('charset', 'utf8') 
data = f.read() 
decoded = json.loads(data.decode(charset)) 

如果我打印的「解碼」的情況如下:

{'Links': {'SummaryData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/summary', 'Value': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/value', 'InterpolatedData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/interpolated', 'Self': 'https://localhost/piwebapi/points/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE', 'PlotData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/plot', 'DataServer': 'https://localhost/piwebapi/dataservers/s0_7qHaW4UHU-RlCaz8tpasAU0hJTExNQU42NDIw', 'RecordedData': 'https://localhost/piwebapi/streams/P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE/recorded'}, 'Id': 1, 'Name': 'SINUSOID', 'WebId': 'P0_7qHaW4UHU-RlCaz8tpasAAQAAAAU0hJTExNQU42NDIwXFNJTlVTT0lE'} 

現在,每當我試圖拉出一個特定的值,我得到一個「KeyError異常」。例如:

print(decoded[0]) 

返回如下:

Traceback (most recent call last): 
    File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensio 
ns\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 1 
06, in exec_file 
    exec_code(code, file, global_variables) 
    File "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensio 
ns\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 8 
2, in exec_code 
    exec(code_obj, global_variables) 
    File "C:\Users\shillman\Documents\Visual Studio 2010\Projects\PythonApplicatio 
n1\PythonApplication1\PythonApplication1.py", line 26, in <module> 
    print(decoded[0]) 
KeyError: 0 

什麼格式在 「解碼」?有沒有一種方法可以做到這一點,它實際上是一本字典?有沒有辦法將它轉換成字典?任何幫助/建議非常感謝!謝謝。

回答

0

What format is "decoded" in? Is there a way I can do this where it is actually a dictionary? Is there a way to convert it to a dictionary?

根據你打印出來的東西,decoded一本字典,而這正是問題。

本字典的鍵是'Links','Name','Id''WebId'。但decoded[0]正在尋找鑰匙0的價值。沒有這樣的鑰匙,所以你得到一個錯誤。

這聽起來像你真正想要的是一種獲得第一個值的方式,通過將字典當作列表或其他序列來對待。您可以治療鍵,或值,或項目字典作爲一個序列,但不是直接的,因爲:

  • 這些東西的順序完全是任意的。
  • 沒有理由字典不能有01作爲密鑰而不是'Links''Name'
  • 因此,Python不會讓你通過使用正常的[]運算符來做到這一點。

如果你想獲得的第一個值字典,而記住的順序是任意的,「第一」可能並不意味着你想要什麼,你可以做這樣的:

list(decoded.values())[0] 

...或者,減少浪費,把它當作一個迭代,而不是試圖將它做成一個序列:

next(iter(decoded.values()) 

如果你還在使用Python 2.x中,values()實際上返回一個列表,所以這兩個是浪費和不必要的;您可以改用next(decoded.itervalues())

+0

感謝您的答覆,訪問這些鏈接。當我使用實際的關鍵之一,說: 打印(解碼[「WebID」] 我仍然得到「KeyError異常‘WebID’」 那是沒有辦法的辦法來引用關鍵 – JOEMan90 2014-10-10 18:56:33

+1

啊,這是區分大小寫? 。我現在不知道,現在開始工作,謝謝! – JOEMan90 2014-10-10 19:06:09

+0

@ JOEMan90:寫一個不區分大小寫的dict子類並不難,如果你願意,掛鉤'json'模塊來返回它們而不是普通的dict值。但是JSON本身是區分大小寫的,所以根據你的輸入數據這可能會變得非常混亂,並且可能不是一個好主意。 – abarnert 2014-10-10 19:14:43

0

json.loads()將json解碼爲python對象。[1]

您的decoded已經是python字典,但它沒有密鑰0

您可以decoded['Links']

[1] https://docs.python.org/2/library/json.html#json.loads

+0

如果我寫 print(decoded ['WebID']) 我還是得到了 KeyError:'WebID'。 我做錯了什麼? – JOEMan90 2014-10-10 19:00:21

+0

啊,區分大小寫。我知道了。謝謝! – JOEMan90 2014-10-10 19:06:42