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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:42:42