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

如何将JSON转为Python对象并替换键中无效字符以支持点号访问

JSON含无效字符键转Python可点访问对象实现方案

核心规则

  • 目标:将JSON键中的空格、: 两种无效字符统一替换为下划线_,处理后支持使用点号直接访问对象属性
  • 示例:原JSON结构 {"key: 1": 1} 处理后可通过 obj.key_1 直接读取属性值,若需合并替换后产生的连续下划线,可补充正则处理逻辑

完整实现代码

import json
import re
from types import SimpleNamespace

def clean_key(key: str) -> str:
    # 替换所有空格和冒号为下划线
    cleaned = key.replace(":", "_").replace(" ", "_")
    # 可选:合并连续的下划线为单个下划线,匹配示例需求 key: 1 → key_1 而非 key__1
    cleaned = re.sub(r'_+', '_', cleaned)
    # 可自行补充其他非法字符的替换规则
    return cleaned

def process_dict(d: dict) -> dict:
    # 递归处理嵌套字典、列表内嵌字典的所有键
    processed = {}
    for k, v in d.items():
        new_k = clean_key(k)
        if isinstance(v, dict):
            processed[new_k] = process_dict(v)
        elif isinstance(v, list):
            processed[new_k] = [process_dict(item) if isinstance(item, dict) else item for item in v]
        else:
            processed[new_k] = v
    return processed

def json_to_obj(json_str: str):
    raw_dict = json.loads(json_str)
    processed_dict = process_dict(raw_dict)
    # 转换为支持点号访问的对象
    return json.loads(json.dumps(processed_dict), object_hook=lambda x: SimpleNamespace(**x))

使用示例

# 测试用JSON,包含带冒号、空格的非法键,以及嵌套、列表结构
test_json = '''
{
    "key: 1": 1,
    "user: name": "张三",
    "contact: info": {
        "phone number": "13xxxxxxxxx"
    },
    "order: list": [
        {"order id": 1, "price: total": 100}
    ]
}
'''

obj = json_to_obj(test_json)

# 点号访问测试
print(obj.key_1) # 输出 1
print(obj.user_name) # 输出 张三
print(obj.contact_info.phone_number) # 输出 13xxxxxxxxx
print(obj.order_list[0].price_total) # 输出 100

内容的提问来源于stack exchange,提问作者user15420598

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:57:03