2015-10-17 72 views
1

我剛剛製作了一個程序來解析api中的一些數據。 api以JSON格式返回數據。當我嘗試分析它,它給了我一個關鍵的錯誤Python:解析JSON時得到Keyerror

Traceback (most recent call last): 
    File "test.py", line 20, in <module> 
    print(parsed_json['plain']) 
KeyError: 'plain' 

這是一個重要的部分代碼(剩下的只是製作的URL,工作完全正常)

response = urllib.request.urlopen(url2).read() 
strr = str(response) 


if "plain" in strr: 
    parsed_json = json.loads(response.decode("UTF-8")) 
    print(parsed_json['plain']) 
elif "INVALID HASH" in strr: 
    print("You have entered an invalid hash.") 
elif "NOT FOUND" in strr: 
    print("The hash is not found") 
elif "LIMIT REACHED" in strr: 
    print("You have reached the max requests per minute, please try again in one minute.") 

我我試圖在普通的領域獲得數據。 下面是從API輸出:

{ 
    "REQUEST": "FOUND", 
    "739c5b1cd5681e668f689aa66bcc254c": { 
    "plain": "test", 
    "hexplain": "74657374", 
    "algorithm": "MD5X5PLAIN" 
    } 
} 
+1

除非我失去了一些東西,它看起來像「plain」是「739c5b1cd5681e668f689aa66bcc254c」的子項。 –

+0

@MorganThrapp我想在平淡之後獲得「測試」。不是本身。 – Uber

+0

'「test」'是「plain」鍵的值嗎? –

回答

1

正是看到什麼就當你可以看到你正在嘗試的目標的內部數據的JSON對象的嵌套結構要容易得多:

工作實施例#1 - 與Python測試2.6.92.7.103.3.53.5.0

import json 

json_string = ''' 
{ 
    "REQUEST": "FOUND", 
    "739c5b1cd5681e668f689aa66bcc254c": { 
     "plain": "test", 
     "hexplain": "74657374", 
     "algorithm": "MD5X5PLAIN" 
    } 
} 
''' 

if 'plain' in json_string: 
    parsed_json = json.loads(json_string) 
    print(parsed_json['739c5b1cd5681e668f689aa66bcc254c']['plain']) 

「純」是「739c5b1cd5681e668f689aa66bcc254c」


編輯的子

以下示例通過parsed_json並檢查環路,用於32個字符的長度的每個鍵,並檢查該鍵具有孩子的價值在'平原'裏面。

工作實施例#2 - 與Python 2.6.92.7.103.3.53.5.0

import json 
import re 

def is_MD5(s): 
    return True if re.match(r"([a-f\d]{32})", key) else False 

strr = ''' 
{ 
    "REQUEST": "FOUND", 
    "739c5b1cd5681e668f689aa66bcc254c": { 
     "plain": "test", 
     "hexplain": "74657374", 
     "algorithm": "MD5X5PLAIN" 
    } 
} 
''' 

parsed_json = json.loads(strr) 

for key, value in parsed_json.items(): 
    if is_MD5(key) and 'plain' in parsed_json[key]: 
     xHash = key 
     xPlain = parsed_json[key]['plain'] 

     print('value in key "plain" in key "{0}" is "{1}"'.format(*[xHash, 
                    xPlain])) 

輸出測試

the value of key "plain" in key "739c5b1cd5681e668f689aa66bcc254c" is "test" 
+0

這使我對它更加清楚!謝謝! – Uber

+0

一個問題,如果我可能會問,如果739c5b1cd5681e668f689aa66bcc254c是不同的?因爲散列會一直有所不同,所以如何使它像動態一樣,以便它抓住它呢? – Uber

+0

@ user3104326有關處理動態密鑰的更優雅的解決方案,請參閱示例2。 – jesterjunk

1

在你的數據,'plain'不是parsed_json成員。它parsed_json['739c5b1cd5681e668f689aa66bcc254c']的成員。所以parsed_json['739c5b1cd5681e668f689aa66bcc254c']['plain']應該工作。

JSON是一種分層數據結構。頂級括號表示整個事物是將被分配到parsed_json的一個對象。每個成員都是名稱 - 值對; 'REQUEST'的值是'FOUND'。然而,'739c5b1cd5681e668f689aa66bcc254c'的值是一個子對象,用左括號表示。其成員是'plain','hexplain''algorithm'。這應該是更清楚,如果我把它寫這樣的:

parsed_json: { 
    "REQUEST":"FOUND", 
    "739c5b1cd5681e668f689aa66bcc254c": { 
     "plain":"test", 
     "hexplain":"74657374", 
     "algorithm":"MD5X5PLAIN" 
    } 
} 
+0

謝謝,這工作,我現在得到測試。爲什麼它是一個成員,是否像一個標題或類似的東西(編程新手,從未使用json) – Uber