ToolConvoyToolConvoyv2.6
DEV

JSON 转 Python — 从 JSON 生成 Python 数据类

从 JSON 生成带类型提示的 Python dataclass。支持可选字段、snake_case 命名、Pydantic 模式 —— 全在浏览器中完成,无需上传。

● 本地运行 · 在您的标签页中生成页面加载以来工具发出的网络请求:0 次

JSON to Python Dataclass

Convert JSON to Python dataclass with type hints. Works entirely in your browser.

Python 的类型注解系统已经从 linter 用的小众特性,发展成语言本身的核心部分。Dataclass、TypedDict 与 Pydantic 模型,是同一个问题的三种不同答案:如何在 Python 中以类型安全的方式表达结构化数据,而不用为每个类写上百行样板代码?JSON-to-Python 生成器会遍历一份 JSON 响应,输出一个清楚知道自身形状的带类型 Python 类 —— 这是迈向类型安全 API 消费、配置管理和数据校验的第一步。

Python 数据建模中「不那么显然」的选择,是在运行时校验与类型检查器校验之间。Pydantic 模型在运行时校验 —— 如果你传入字符串而期望的是 int,它会立刻抛出一个 ValidationError,这让它成为 API 边界(FastAPI 端点、消息队列、配置文件解析)的正确选择。Dataclass 只在类型检查器(mypy、pyright)里校验 —— 传错类型时 IDE 会标红,但代码照样能跑。TypedDict 在运行时什么也不做,纯粹是给类型检查器看的注解。来自外部源的数据选 Pydantic;在代码内部产生、需要带类型安全传来传去的数据选 dataclass;类型检查器就是强制层的代码库选 TypedDict。

生成 dataclass 之后最常见的下一步,是把它和 json.loads()requests.get().json() 配合,用一个自定义解码器把 JSON 键映射到 dataclass 字段。对 FastAPI 来说,把生成的 Pydantic 模型包成路由参数,校验和序列化由 FastAPI 自动完成。对 SQLAlchemy 来说,生成的 dataclass 变成 ORM 模型的属性 —— 表映射由你手写。生成的类是 schema;装配的工作属于应用层。

广告

使用方法

  1. 粘贴你的 JSON

    拖入一个 JSON 对象或粘贴一段 JSON 字符串。生成器会为每个字段推断 Python 类型,并输出一个为每个属性都带类型提示的 `@dataclass`。

  2. 选择类风格

    在 `@dataclass`(标准库)、`TypedDict`(仅类型检查,无运行时开销)和 `pydantic.BaseModel`(Pydantic 的完整校验)之间选择。三种风格各有不同的定位。

  3. 复制或下载 .py 文件

    把 Python 类复制到剪贴板,或下载为 .py 文件。输出兼容 Python 3.9+ 和标准库 —— 选择 dataclass 时无需任何额外依赖。

常见问题

该选 dataclass、TypedDict 还是 Pydantic?

默认选 dataclass —— 它带类型提示,支持 `dataclasses.asdict(dc)` 做往返转换,而且不依赖任何额外包。TypedDict 是仅类型检查器(mypy、pyright)的构造,运行时零开销。Pydantic 模型增加了校验、解析和 schema 生成能力,但需要 `pydantic` 包。

如何处理 camelCase 的 JSON 键?

默认情况下,camelCase 的 JSON 键(`userId`、`createdAt`)会被输出为 snake_case 的 Python `@dataclass` 字段(`user_id`、`created_at`),并附带 `field(metadata={'json': 'userId'})` 注解。开启「保持原始命名」开关后,字段名会与 JSON 中的写法完全一致。

如何处理可选字段?

样本里为 null 的字段,以及某些数组元素里缺失的字段,都会变成 `Optional[T]` 并默认值为 `None`。类型提示 `Optional[str]` 在 Python 里就是 JSON 中 `string | null` 的等价写法。

嵌套的 JSON 对象怎么处理?

嵌套对象会变成嵌套的 dataclass 或 Pydantic 模型类。在 TypedDict 模式下,嵌套对象会变成嵌套的 TypedDict。嵌套结构与 JSON 完全镜像 —— `user.profile.name` 这条路径会产出 `User` 类,其中带一个 `profile: Profile` 字段。

会处理 Python 保留字吗?

会的。`class`、`import`、`from`、`pass`、`type` 这类 JSON 键在 Python 类中会被转成 `class_`、`import_`、`from_`、`pass_`、`type_`。`metadata={'json': 'class'}` 注解会保留原键,以便序列化。

限制说明

  • 不集成 async 或 FastAPI输出只是数据类。FastAPI 路由定义、异步数据库映射、依赖注入装配都不会生成 —— 这些围绕 dataclass 由你自己手写。
  • 歧义情况下推断为 Any 类型混合类型的 JSON 数组,或深层多态的值,会被推断为 `Any`。如果 API 契约比样本所暗示的更强,可以手写一个更窄的类型提示。
  • Pydantic V2 与 V1 的差异Pydantic 选项输出的是 Pydantic V2 风格的模型(`model_validate`、`model_dump`)。如果你的代码库还在用 Pydantic V1,把方法调用手动改成 `.parse_obj` 和 `.dict`。

平台说明

macOS
PyCharm、装了 Pylance 的 VS Code,以及配 jedi 的 vim 都能正确处理生成的 dataclass。在开发过程中,可以从 API 响应里直接用本浏览器工具一次性生成。
Windows
生成的 dataclass 可以在任何 Python 环境中运行。对从 API 调试器粘贴进来的内容,用本浏览器工具快速一次性生成 dataclass 很方便。
Linux
命令行场景下,标准等价工具是 `datamodel-code-generator`。当没有可用 Python 环境或额外包时,本浏览器工具是临时性生成场景的正确选择。
Web
完全在客户端运行。生成过程只需几毫秒 —— 粘贴、复制、完成。
广告
广告