2017-07-10 188 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的建议。