Flask API代理如何实现JSON路径全层级大小写不敏感访问?
全层级大小写不敏感的嵌套JSON访问方案
要解决嵌套JSON(包含字典和列表)的全层级大小写不敏感访问问题,你可以自己实现递归转换逻辑,把整个JSON结构转换成自定义的大小写不敏感字典,同时处理列表中的嵌套字典元素。
实现代码
先定义一个大小写不敏感的字典类,再写递归转换函数处理整个嵌套结构:
class CaseInsensitiveDict(dict): def __getitem__(self, key): # 处理字符串键的大小写匹配 if isinstance(key, str): for k in self.keys(): if k.lower() == key.lower(): return super().__getitem__(k) # 非字符串键或无匹配时抛出KeyError raise KeyError(key) def get(self, key, default=None): # 兼容原生dict的get方法 try: return self[key] except KeyError: return default def __contains__(self, key): # 兼容in操作符 if isinstance(key, str): return any(k.lower() == key.lower() for k in self.keys()) return super().__contains__(key) def make_case_insensitive(data): """递归转换嵌套结构为大小写不敏感格式""" if isinstance(data, dict): insensitive_dict = CaseInsensitiveDict() for k, v in data.items(): insensitive_dict[k] = make_case_insensitive(v) return insensitive_dict elif isinstance(data, list): # 遍历列表,转换其中的字典元素 return [make_case_insensitive(item) for item in data] else: # 非字典/列表类型直接返回原值 return data
在Flask中使用
接收POST请求后,将解析后的JSON数据传入转换函数,之后就能用任意大小写组合的键路径访问值:
from flask import Flask, request app = Flask(__name__) @app.route('/api/proxy', methods=['POST']) def api_proxy(): raw_json = request.json # 转换为全层级大小写不敏感结构 insensitive_data = make_case_insensitive(raw_json) # 任意大小写组合都能取到值 account_token = insensitive_data['orders']['authentication']['accounttoken'] # 也可以混用大小写:insensitive_data['ORDERS']['Authentication']['AccountToken'] # 后续逻辑:构造请求转发到后端API... return {'status': 'success', 'extracted_token': account_token}
关键特性说明
- 全层级递归处理:无论嵌套多少层字典,或是列表中的字典元素,都会被转换成大小写不敏感格式
- 兼容原生字典操作:支持
[]取值、get()方法和in操作符,用法和普通字典完全一致 - 冲突处理:如果存在多个键小写后完全相同(比如
'AccountToken'和'accounttoken'同时存在),会返回第一个匹配的键对应的值,这种场景建议在业务逻辑中提前做去重校验
内容的提问来源于stack exchange,提问作者Erik Oosterwaal
相关产品推荐
相关产品推荐

