Python中数字为键的JSON转对象后访问属性报错如何解决
问题原因说明
Python 语法规定,合法的变量/属性名不能以数字开头,也不能仅由数字组成。你通过 SimpleNamespace 将 JSON 键转为对象属性后,键"1"不符合 Python 标识符规则,因此无法直接用.语法访问,这就是x.1.b报错的核心原因。
正确访问方案
方案1:直接用 getattr() 读取非法属性名
不需要修改原有转换逻辑,直接用Python内置的getattr()函数获取名称非法的属性即可:
# 分步写法 obj_1 = getattr(x, "1") b_value = obj_1.b # 一行简写 b_value = getattr(x, "1").b
方案2:转换时预处理键名,统一转为合法标识符
如果希望后续统一用.语法访问所有属性,可以在转换阶段修改键名规则,给数字开头的键增加固定前缀:
from types import SimpleNamespace import json def process_dict_to_namespace(d): processed = {} for k, v in d.items(): # 数字开头的键加前缀k_,转为合法标识符 new_k = f"k_{k}" if k[0].isdigit() else k processed[new_k] = v return SimpleNamespace(**processed) # 替换原有转换逻辑 x = json.loads(json.dumps(data, indent=4, sort_keys=True), object_hook=process_dict_to_namespace) # 后续可直接用点语法访问 b_value = x.k_1.b
方案3:直接使用字典访问(最简单)
如果没有必须用对象属性访问的强需求,其实可以不用加object_hook参数,直接把JSON解析为字典,用键索引访问即可:
x = json.loads(json.dumps(data, indent=4, sort_keys=True)) b_value = x["1"]["b"]
内容的提问来源于stack exchange,提问作者ali kamrani
相关产品推荐
相关产品推荐

