Json获取key总是报错还又臭又长?那是因为你没有用到我这个safeget自定义方法

前言

我们在遇到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}")

在这里插入图片描述
虽然免不了添加索引键,但代码的可读性大大提高了,而且当出错时也会按照设定的默认值进行赋值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ztop

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值