我有一个json字典,我需要检查数据的值,看看是否有匹配。我使用多个if
语句和in
操作符,如下所示:
"SomeData":
{
"IsTrue": true,
"ExtraData":
{
"MyID": "1223"
}
}
json_data = MYAPI.get_json()
if 'SomeData' in json_data:
some_data = json_data['SomeData']
if 'IsTrue' in some_data:
if some_data['IsTrue'] is True:
if 'ExtraData' in some_data:
if 'MyID' in some_data['ExtraData']:
if some_data['ExtraData']['MyID'] == "1234":
is_a_match = True
break
我知道在python3中应该使用in
运算符,但我认为必须有一个比使用多个if语句更好的方法,就像我正在使用。有更好的方法来解析json数据像这样吗?
是的,您可以假设键存在,但如果它们不存在,则捕获KeyError
。
try:
some_data = json_data['SomeData']
is_a_match = (
some_data['IsTrue'] is True and
some_data['ExtraData']['MyID'] == "1234"
)
except KeyError:
is_a_match = False
这种风格被称为"请求原谅比请求许可更容易"(EAFP),在Python中使用得很多。另一种选择是三思而后行(LBYL),您可以在您的解决方案中使用它。
我建议编写一个路径函数来访问嵌套字典中的值。类似这样的代码(伪代码):
def get_path_value(json_dict, path):
"""
json_dict - dictionary with json keys and values
path - list of key sequences, e.g. ['SomeData', 'IsTrue']
you can make this a helper function and use an entry point that
splits paths, e.g. "SomeData/IsTrue"
"""
if len(path) == 1:
# last tag, base case
return json_dict[path[0]]
else:
return get_path_value(json_dict[path[0]], path[1:])
如果您想要除坏键之外的其他内容,请添加try/catch,但这将使您更有效地导航字典。然后你有这样的东西:
if get_path_value(json_dict, ["SomeData", "IsTrue"]) == True and ...
你甚至可以写一个漂亮的小类来包装这一切,例如json["SomeData/IsTrue"] == True
祝你好运玛丽