JSON序列化安全类型的精准类型标注实践

酷萱小哥_6919

酷萱小哥_6919

2026-05-27

486人浏览

原创

JSON序列化安全类型的精准类型标注实践

本文介绍如何为支持json.dumps的函数参数设计严谨、可静态检查的类型提示,解决Union[List[Any], Dict[Any, Any]]不完整且违反mypy规范的问题,推荐使用递归TypeAlias定义完整的JSON可序列化类型。

本文介绍如何为支持`json.dumps`的函数参数设计严谨、可静态检查的类型提示,解决`union[list[any], dict[any, any]]`不完整且违反`mypy`规范的问题,推荐使用递归`typealias`定义完整的json可序列化类型。

在Python类型系统中,为接受任意JSON可序列化对象的函数(如内部调用json.dumps)提供精确类型标注,是提升代码健壮性与可维护性的关键一步。原始写法 Union[List[Any], Dict[Any, Any]] 存在三大缺陷:一是遗漏None、int、str、bool等基础JSON原子类型;二是Any显式使用被mypy严格禁止(违反PEP 484);三是无法表达嵌套结构(如List[Dict[str, List[int]]])的递归合法性。

现代Python(3.12+)及主流类型检查器(如mypy ≥ 1.0)已原生支持递归类型别名(Recursive TypeAlias),这是目前最准确、最符合JSON规范的解决方案。标准JSON可序列化值仅包含以下六类:null(对应None)、number(int/float)、string(str)、boolean(bool)、array(list)、object(dict),其中array和object可无限嵌套。

因此,推荐定义如下类型别名:

from typing import List, Dict, Union, TypeAlias, Optional

# ✅ 推荐:显式、递归、符合JSON规范的TypeAlias(支持mypy 1.0+)
JsonType: TypeAlias = Union[
    None,
    bool,
    int,
    float,
    str,
    List["JsonType"],      # 注意字符串字面量引用,避免前向引用错误
    Dict[str, "JsonType"], # 键必须为str(JSON object key限制)
]

⚠️ 注意事项:

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载
  • float需显式加入——尽管json.dumps支持浮点数,但int无法覆盖它;
  • 使用带引号的字符串字面量(如"JsonType")解决前向引用问题,这是PEP 695前的标准做法;
  • Dict的键类型必须为str,因JSON object不允许非字符串键,否则json.dumps会抛出TypeError;
  • 若需兼容自定义JSONEncoder(如处理date),类型标注仍应基于原始输入结构,而非编码后形态——date本身不可直接序列化,须由cls参数在运行时转换,因此不应将date加入JsonType;类型系统只保证json.dumps不因类型错误提前崩溃,不替代编码逻辑。

修正后的函数签名如下:

import json
from typing import Any, **kwargs

def my_function_doing_stuff_then_serializing(
    input: JsonType, 
    **kwargs: Any
) -> None:
    json.dumps(input, **kwargs)

该签名可安全接收:

  • 基础值:None, 42, "hello", True
  • 容器:[1, "a", True], {"id": 1, "tags": ["x"]}
  • 深度嵌套:[{"users": [{"name": "Alice", "active": True}]}]

同时完全兼容自定义JSONEncoder:

from datetime import date

class DateEncoder(json.JSONEncoder):
    def default(self, obj: Any) -> Any:
        if isinstance(obj, date):
            return obj.isoformat()
        return super().default(obj)

# ✅ 类型检查通过:date对象不在JsonType中,但被DateEncoder处理
my_function_doing_stuff_then_serializing([date.today()], cls=DateEncoder)

总结:使用递归TypeAlias定义JsonType,既满足静态类型检查的完备性要求,又严格遵循JSON数据模型约束,是当前Python生态下最专业、可持续的实践方案。避免滥用Any或不完整的联合类型,让类型系统真正成为JSON序列化逻辑的守护者。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js json

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1711

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4364

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25437

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3107

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1163

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2423

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习