json取值,如果字段不存在,匹配下一个字段
需求
json取值,如果字段不存在,匹配下一个字段
mem_mod_current_frequency = re[“mem_mod_cur_frequency”]
# 厂商
mem_mod_vendor = re[“mem_mod_vendor”]
两种不同型号的设备可能存在:mem_mod_cur_frequency 和 mem_mod_frequency 字段
不想开发2个模板
在 JSON 数据处理中,安全地获取可能不存在的字段值的最佳方法是使用 get()
方法或 try-except
块。以下是几种安全取值的方法:
1. 使用 dict.get()
方法(推荐)
# 获取内存频率,如果字段不存在则返回 None
mem_mod_current_frequency = re.get("mem_mod_cur_frequency")# 获取厂商信息,如果字段不存在则返回 None
mem_mod_vendor = re.get("mem_mod_vendor")
2. 提供默认值
# 获取内存频率,如果字段不存在则返回默认值 0
mem_mod_current_frequency = re.get("mem_mod_cur_frequency", 0)# 获取厂商信息,如果字段不存在则返回默认字符串
mem_mod_vendor = re.get("mem_mod_vendor", "Unknown Vendor")
3. 尝试多个字段名(匹配下一个字段)
# 尝试多个可能的字段名获取内存频率
mem_mod_current_frequency = (re.get("mem_mod_cur_frequency") orre.get("current_frequency") orre.get("frequency") or0 # 最终默认值
)# 尝试多个可能的字段名获取厂商信息
mem_mod_vendor = (re.get("mem_mod_vendor") orre.get("vendor") orre.get("manufacturer") or"Unknown Vendor" # 最终默认值
)
4. 使用 try-except
块
try:mem_mod_current_frequency = re["mem_mod_cur_frequency"]
except KeyError:try:mem_mod_current_frequency = re["current_frequency"]except KeyError:mem_mod_current_frequency = 0try:mem_mod_vendor = re["mem_mod_vendor"]
except KeyError:try:mem_mod_vendor = re["vendor"]except KeyError:mem_mod_vendor = "Unknown Vendor"
5. 封装为通用函数(最佳实践)
def get_nested_value(data, *keys, default=None):"""安全获取嵌套值,尝试多个键"""for key in keys:if isinstance(data, dict) and key in data:return data[key]return default# 使用示例
mem_mod_current_frequency = get_nested_value(re, "mem_mod_cur_frequency", "current_frequency", "frequency",default=0
)mem_mod_vendor = get_nested_value(re,"mem_mod_vendor","vendor","manufacturer",default="Unknown Vendor"
)
6. 使用第三方库(如 jmespath
)
import jmespath# 安装:pip install jmespathmem_mod_current_frequency = jmespath.search("mem_mod_cur_frequency || current_frequency || frequency || `0`",re
)mem_mod_vendor = jmespath.search("mem_mod_vendor || vendor || manufacturer || 'Unknown Vendor'",re
)
推荐方案
对于大多数情况,方法5(封装通用函数) 是最佳选择:
- 代码简洁清晰
- 支持多个备选字段
- 可设置默认值
- 可复用性高
def safe_get(data, *keys, default=None):"""安全获取值,尝试多个键"""for key in keys:if key in data:return data[key]return default# 使用示例
mem_mod_current_frequency = safe_get(re, "mem_mod_cur_frequency", "current_frequency", "frequency",default=0
)mem_mod_vendor = safe_get(re,"mem_mod_vendor","vendor","manufacturer",default="Unknown Vendor"
)
这种方法确保了即使 JSON 数据结构变化或字段名不一致,代码也能安全运行,避免 KeyError
异常。