Python中是否存在表示任意可JSON序列化对象的类型?
Python中是否存在表示任意可JSON序列化对象的类型?
这个问题问到点子上了!我之前也纠结过json.load返回Any的问题,做类型检查时总觉得不够严谨。
先给你明确答案:Python标准库里目前没有现成的、专门用来表示“任意可JSON序列化对象”的预定义类型。不过我们可以很方便地自己定义,或者用第三方库的现成方案,完全不用手写长长的重复类型。
下面给你几个实用的方案:
自定义递归联合类型
JSON原生支持的类型映射到Python里,就是None、bool、int、float、str,再加上由这些类型组成的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模块支持的对象,如果你的代码里用了自定义编码器(比如序列化datetime、UUID这类对象),那你只需要在这个基础类型里把对应的Python类型加进去就行。
备注:内容来源于stack exchange,提问作者UCYT5040




