You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中是否存在表示任意可JSON序列化对象的类型?

Python中是否存在表示任意可JSON序列化对象的类型?

这个问题问到点子上了!我之前也纠结过json.load返回Any的问题,做类型检查时总觉得不够严谨。

先给你明确答案:Python标准库里目前没有现成的、专门用来表示“任意可JSON序列化对象”的预定义类型。不过我们可以很方便地自己定义,或者用第三方库的现成方案,完全不用手写长长的重复类型。

下面给你几个实用的方案:

  • 自定义递归联合类型
    JSON原生支持的类型映射到Python里,就是Noneboolintfloatstr,再加上由这些类型组成的list,以及键为str、值为这些类型的dict。我们可以用递归的Union来定义这个类型:

    from typing import Union, Dict, List
    
    JSONValue = Union[None, bool, int, float, str, List["JSONValue"], Dict[str, "JSONValue"]]
    

    要是你用的是Python 3.10及以上版本,还能用上更清爽的竖线联合语法:

    from typing import Dict, List
    
    JSONValue = None | bool | int | float | str | List["JSONValue"] | Dict[str, "JSONValue"]
    

    把这个定义放在项目的公共类型文件(比如types.py)里,之后到处导入用就行,完全不用重复写。

  • 借助第三方库的现成类型
    要是连自定义都嫌麻烦,很多常用的类型工具库都提供了这个类型。比如pydantic里的Json类型,它不仅封装了正确的可JSON序列化类型标注,还能配合pydantic的验证功能,帮你确保输入输出符合JSON格式,一举两得。

最后补充一句:上面的类型是针对Python默认JSON模块支持的对象,如果你的代码里用了自定义编码器(比如序列化datetimeUUID这类对象),那你只需要在这个基础类型里把对应的Python类型加进去就行。

备注:内容来源于stack exchange,提问作者UCYT5040

火山引擎 最新活动