从 JSON 到 Python 数据类

粘贴 JSON 示例即可生成@dataclass(或Pydantic格式的BaseModel),其中每个字段均包含类型提示,适当时需标注strintfloatboolOptional[...]List[...]。嵌套对象将自动成为独立的数据类。输出结果采用PEP 8格式,可直接粘贴至Python文件中。

如何将 JSON 转换为数据类

  1. 1

    粘贴 JSON

    单个样本即可满足需求;提供多个样本可更准确地判断哪些字段可以为空(可空性)。

  2. 2

    选择样式

    标准库 `@dataclass`、Pydantic `BaseModel` 或 `TypedDict`(仅用于静态类型检查)。

  3. 3

    选择Python版本

    `list[str]`语法版本要求3.9及以上;`|`联合类型版本要求3.10及以上;`Optional[...]`/`List[...]`版本要求3.8。

  4. 4

    复制代码

    一个根类及其嵌套类。将其粘贴到 `.py` 文件中并导入。

示例输出:标准 @dataclass

输入:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

输出(Python 3.10及以上版本):

from dataclasses import dataclass, field
from typing import Optional


@dataclass
class User:
    first_name: str
    age: int
    tags: list[str] = field(default_factory=list)
    email: Optional[str] = None

使用 Pydantic 的相同输入

from typing import Optional
from pydantic import BaseModel


class User(BaseModel):
    first_name: str
    age: int
    email: Optional[str] = None
    tags: list[str] = []

类型映射

JSON 值 Python 类型
字符串 str
整数 int
数字(小数) float
布尔值 bool
空值(单独显示) None
空值 + 其他类型 Optional[T]
ISO日期字符串 date(Python 3.7+)
ISO 日期时间 datetime
单类型数组 list[T]
混合数组 list[Union[T1, T2]]
对象 嵌套类

Dataclass、Pydantic 与 TypedDict 的区别

类型 使用时机
@dataclass 标准库解决方案,无需运行时验证
Pydantic 运行时验证与强制转换(FastAPI、设置)
TypedDict 仅进行静态类型检查,不涉及实例类
attrs attrs 上实现标准化的遗留项目

常见错误

  • 忘记使用 default_factory 设置可变默认值。list[str] = [] 默认值属于数据类陷阱(跨实例共享),请使用 field(default_factory=list)
  • **可选但无默认值。**即使不包含= Noneemail: Optional[str]仍需该参数。请确保其与您的 JSON 语义一致。
  • **Pydantic v1与v2版本对比:**语法及功能特性存在差异(类Configmodel_configvalidatorfield_validator)。生成器默认使用v2版本。
  • 组合顺序对反序列化至关重要。Pydantic会按照声明顺序验证类型;若存在歧义,应优先使用最具体的类型(例如:int 应置于 str 之前)。

常见问题

用于存储无验证信息的简单值类型的数据类。使用 Pydantic 时,可实现运行时验证、类型强制转换或 FastAPI 集成;仅需静态类型检查(如 mypy、pyright)且无需创建类实例时,则使用 TypedDict。

不适用于Python 3.10及以上版本(这些版本已原生支持|联合语法和list[str]语法)。对于3.7至3.9版本的项目,可通过PEP 563字符串注释使用更新的语法。生成器会在需要时发出警告。

每个嵌套对象均成为独立的类。根类通过名称引用这些对象,从而实现类型复用。系统会检测并标记循环引用。

是的,如果您选择Pydantic架构方案。FastAPI直接使用Pydantic模型作为请求/响应类型;而在内部数据处理方面,@dataclass则更为轻量级。

相关工具

此工具还提供其他语言版本