2017-07-10 223 views
2

編輯:這裏有更多的上下文的JSON如何接收。我使用的是阿皮亞伊API生成到自己的平臺的要求,他們有一個方法來檢索,就像這樣:KeyError異常讀取JSON文件

# instantiate ApiAI 
ai = apiai.ApiAI(CLIENT_ACCESS_TOKEN) 

# declare a request obect, fill in in lower lines 
request = ai.text_request() 

# send ApiAI the request 
request.query = "{}".format(textobject.body) 

# get response from ApiAI 
response = request.getresponse() 
response_decode = response.read().decode("utf-8") 
response_data = json.loads(response_decode) 

我編碼在Django web應用程序,並試圖通過閱讀發送到webhook的JSON響應。該代碼通過JSON閱讀,它已被解碼後,是:

if response_data['result']['action'] != "": 
    Request.objects.create(
     request = response_data['result']['resolvedQuery'] 
    ) 

當我嘗試運行這段代碼,我得到這個錯誤:

KeyError: 'result' 

上線

if response_data['result']['action'] != "": 

我很困惑,因爲它在我看來像'result'應該是這個正在閱讀的JSON的有效鍵:

{ 
    'id':'65738806-eb8b-4c9a-929f-28dc09d6a333', 
    'timestamp':'2017-07-10T04:59:46.345Z', 
    'lang':'en', 
    'result':{ 
     'source':'agent', 
     'resolvedQuery':'Foobar', 
     'action':'Baz' 
    }, 
    'alternateResult':{ 
     'source':'domains', 
     'resolvedQuery':'abcdef', 
     'actionIncomplete':False, 
    }, 
    'status':{ 
     'code':200, 
     'errorType':'success' 
    } 
} 

有另一種方式,我應該來讀這個JSON在我的計劃?

+3

需要更多的上下文,請在發佈代碼的問題行之前,包括如何響應從JSON序列化Python對象。 – wmorrell

+3

這不是正在加載的JSON,我相信你沒有正確加載它,你做了json.loads? –

+0

是的,在將響應解碼爲utf-8之後,我使用了'json.loads'。從那裏,我試圖訪問它內的元素,就像我用普通的json一樣。 – hackerman

回答

1

嘗試:

import JSON 
if 'action' in response_data: 
    parsed_data = json.loads(response_data) 
    if parsed_data['result']['action'] != "": 
     Request.objects.create(request = parsed_data['result']['resolvedQuery']) 
+0

@ user8109379是否有效? – badiya

+0

嗨,我的代碼中已經有了類似的東西。我編輯了我的帖子以提供更多的上下文 - 我導入了JSON,解碼了響應,並通過json.loads運行了它。 – hackerman

1

感謝大家的想法。事實證明,我試圖實施ApiAI API的過程中出現了另一個錯誤,並且導致了這個錯誤。它現在讀取JSON的罰款,我使用@ sasuke的建議。