前言
我们在遇到Json数据时,会因为要获取它里面的数据,而使用一些方法,但这些方法当取不到值就会报错,有些写起来又臭又长,那有什么自定义方法可以一次性解决呢?
先来看看示例数据👇
json_data = {
'user': {
'name': 'Ztop',
'age': 20,
'skill': ['python', 'java', 'linux'],
"city": {
"community": {
'home': {
'room': {
'desk': ['computer', 'phone']
}
}
}
}
}
}
取值的几种方式
1、键访问或索引访问
user_data = json_data['user']
name = user_data['name']
age = user_data['age']
skill = user_data['skill']
这就是最平常的方法,可以取到值,但它的缺点就是一旦json数据中没有相关键就会报错
print(user_data['country'])
因为取不到值,一般都会报错找不到该key
2、get取值
country = user_data.get("country")
虽然不会报错,但当取不到值时会输出为None
你可能会说,可以给他一个默认值,OK
country = user_data.get("country", "")
像上面这样,既不会报错,又不会输出为None
可如果是多个key嵌套呢,那这个语句就会变得又臭又长,一行代码Ctrl+Alt+L
格式化以后要分好几行,可读性也一般
自定义方法
那有什么办法解决这些呢?我们可以仿照get方法的逻辑自定义一个safeget方法
"""
json数据安全获取key值,当key值不存在时,会输出默认值
"""
def json_safeget(d, keys, default=None):
if not isinstance(keys, (list, tuple)):
return default
result = d
for key in keys:
if isinstance(result, dict) and key in result:
result = result[key]
elif isinstance(result, list) and isinstance(key, int) and 0 <= key < len(result):
result = result[key]
else:
return default
return result
参数解释
- d: 要搜索的字典或列表。
- keys: 一个包含键或索引的列表或元组,用于在嵌套结构中导航。
- default: 如果在任何点找不到键或索引,将返回这个默认值。
目的
在不抛出异常的情况下,从嵌套的 JSON 数据结构中检索值。
如果遇到任何问题(如键不存在或索引越界),它会返回一个预定义的默认值,而不是引发错误。
这使得函数在处理不确定或不完整的数据时更加健壮
实际示例演示
user_data = json_safeget(json_data, ['user'], {})
name = json_safeget(user_data, ['name'], '')
age = json_safeget(user_data, ['age'], '') or 0
country = json_safeget(user_data, ['country'], '')
skill = json_safeget(user_data, ['skill'], [])
desk_data = json_safeget(json_data, ["user", "city", "community", "home", "room", "desk"], [])
print(f"name: {name}")
print(f"age: {age}")
print(f"country: {country}")
print(f"skill: {skill}")
print(f"desk_data: {desk_data}")
虽然免不了添加索引键,但代码的可读性大大提高了,而且当出错时也会按照设定的默认值进行赋值