Python如何将request.json反序列化为可通过属性访问的对象
request.json转属性访问对象实现方法
逐行调用get取参确实冗余,直接实现一个字典转对象的转换函数即可,不需要引入额外依赖。
轻量快速实现
用Python标准库的SimpleNamespace就能快速实现属性式访问,支持嵌套字典的递归版本代码如下:
from types import SimpleNamespace def toObject(d: dict): data = {} for key, value in d.items(): if isinstance(value, dict): data[key] = toObject(value) else: data[key] = value return SimpleNamespace(**data)
如果你要和原有dict.get(key, None)的逻辑完全一致,访问不存在的字段时不抛出AttributeError、直接返回None,用自定义类实现更灵活:
class DictObj: def __init__(self, mapping: dict): for key, value in mapping.items(): if isinstance(value, dict): setattr(self, key, DictObj(value)) else: setattr(self, key, value) def __getattr__(self, item): return None def toObject(d): return DictObj(d or {})
注意:调用时建议传
request.json or {}做兜底,避免请求未携带合法JSON体时传入None,触发初始化报错。
使用时完全符合你的预期:
@route('lda', methods=["POST"]) def lda(self): requestData = toObject(request.json) # 直接通过属性取参 domain = requestData.domain username = requestData.username password = requestData.password server_address = requestData.server_address # 访问不存在的字段也会返回None,和原来get写法行为一致 # not_exist = requestData.xxx # 值为None
正式项目推荐写法
如果需要做参数校验、IDE智能补全,推荐用标准库的dataclass定义请求参数结构,可维护性更强:
from dataclasses import dataclass from typing import Optional @dataclass class LdaReq: domain: Optional[str] = None username: Optional[str] = None password: Optional[str] = None server_address: Optional[str] = None @route('lda', methods=["POST"]) def lda(self): requestData = LdaReq(**(request.json or {})) xcv = requestData.username
这种写法会把接口支持的参数明确定义在结构里,后续迭代时不用翻业务代码找参数,字段名写错、类型不匹配时也能快速定位问题。
内容的提问来源于stack exchange,提问作者realPro
相关产品推荐
相关产品推荐

