我正在写一个flask API,它可以接收不同类型的嵌套json文件。我想根据来自这些文件的不同信息做一些事情。
我根据if语句对文件进行排序,这是简化版本:
if (jsonFile['data']['shape'] == "cube"):
function(jsonFile)
elif (jsonFile['data']['shape'] == "cone"):
function(jsonFile)
elif (jsonFile['data']['sphere']):
function(jsonFile)
else:
print("Unknown file")
当我通过postman发送一个嵌套的json文件时,例如一个包含sphere的文件,我得到了一个500 error "KeyError: shape"
,并且我从来没有到达elif语句。
如果我把包含sphere的elif语句和顶部的一个交换,那么只有sphere有效,其余的都无效。它只对顶部的if语句有效,如果条件不满足,它会抛出一个错误并忽略块的其余部分。即使我发送随机的东西,我也永远不会到达else语句。
其余语句都可以独立工作。
包含多维数据集的json文件示例:
{
"data": {
"shape": "cube"
}
}
包含sphere的json文件示例:
{
"data": {
"sphere": {
"description": "spherical"
}
}
}
这是完整的错误:
ERROR in app: Exception on /processshape [POST]
Traceback (most recent call last):
File "C:\Users\user1\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 2525, in wsgi_app
response = self.full_dispatch_request()
File "C:\Users\user1\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1822, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Users\user1\AppData\Local\Programs\Python\Python310\lib\site-packages\flask\app.py", line 1796, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File "d:\python\shape-api\app.py", line 34, in processshape
if (resp['data']['shape'] == "cube"):
KeyError: 'shape'
127.0.0.1 - - [02/Feb/2023 00:03:38] "POST /processshape HTTP/1.1" 500 -
1条答案
按热度按时间ujv3wf0j1#
问题在于
if (jsonFile['data']['shape'] == "cube")
已执行。这将执行表达式jsonFile['data']['shape']
。jsonFile['data']
将计算为dict。但是,此dict不包含键shape
。因此,将引发KeyError
,并且不会执行elif。你可以通过改变
到
这样,如果键
shape
的值不存在,您就不会尝试访问它。同样的修改也必须应用到其他情况中。如果不能确定键
data
是否总是包含在jsonFile
中,您也必须检查它。