Python解析可空嵌套JSON提取primary_ip触发AttributeError问题咨询
报错根因
你当前代码触发错误的核心原因是对字典get()方法的默认值触发逻辑存在误解:
- 字典的
get(key, default)方法,仅当目标键不存在于字典中时,才会返回设置的默认值。 - 如果目标键实际存在,只是键对应的值为Python的
None(对应JSON结构里的null),get()方法会直接返回这个None值,不会触发兜底的默认值逻辑。
你当前代码里的result.get('primary_ip', {}),当遇到primary_ip: null的设备条目时,实际返回值是None而非空字典,紧接着对None调用.get('address')方法,就会抛出你看到的属性错误。
可以用极简代码复现这个逻辑:
test_data = {"primary_ip": None} print(test_data.get("primary_ip", {})) # 实际输出为None,不是设置的空字典
兼容空值的实现方案
以下几种写法都可以兼容primary_ip为null的场景,按需选择即可:
- 显式空值判断
按照你之前注释掉的判断逻辑补全兜底:primary_ip_info = result.get('primary_ip') # 当primary_ip存在且非None时再提取address字段,否则y赋值为None y = primary_ip_info.get('address') if primary_ip_info else None - 逻辑运算符短路兜底
用or逻辑判断,把空值替换为空字典再提取字段:
逻辑是:如果y = (result.get('primary_ip') or {}).get('address')result.get('primary_ip')返回值是None/空值,就自动使用空字典作为后续方法调用的对象,避免调用报错。 - 可选链语法(适配Python 3.10及以上版本)
用Python原生的可选链操作符简化写法,逻辑和上面完全一致:y = result.get('primary_ip')?.get('address')
额外提示:你代码里的
z=result.get('site')['name']存在同样的空值风险,如果某个设备没有关联站点,这行代码也会触发相同的NoneType报错,可以用同样的兜底逻辑改写为z = (result.get('site') or {}).get('name'),提前规避问题。
内容的提问来源于stack exchange,提问作者Eric Graham
相关产品推荐
相关产品推荐

