如何将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
相关产品推荐
相关产品推荐

