You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:27:06