logo
GeekFormat

JSON 转 Python

免费在线 JSON 转 Python 工具,把 JSON 数据自动转换为带类型注解的 Python @dataclass 类。字符串映射为 str,整数映射为 int,浮点映射为 float,布尔映射为 bool,数组映射为 List[T],嵌套对象生成独立 dataclass,null 映射为 Optional[Any]。本地浏览器运行,一键复制或下载 model.py。 生成的代码兼容 Python 3.7+ 的 dataclasses 标准库,可直接被 FastAPI、Django REST framework、marshmallow、cattrs 等主流 Python 框架消费,也可在 Jupyter Notebook 中作为强类型数据结构使用。

相关推荐

关于 JSON 转 Python:把 JSON 数据变成可运行的 dataclass 模型

JSON 转 Python 是把 JSON 格式的数据(对象或数组)转换为 Python dataclass 类型定义的过程。Python 是当下最流行的通用编程语言之一,广泛用于 Web 后端(FastAPI / Django / Flask)、数据科学(pandas / scikit-learn)、爬虫、运维脚本、机器学习、自动化测试等场景。开发中经常需要把 API 文档或实际响应中的 JSON 样本转成 Python 类型,手写 class 不仅重复劳动多,还容易把字段类型写错,本工具的目标就是把这一过程自动化。

dataclass 是 Python 3.7 引入的标准库特性(PEP 557),通过 @dataclass 装饰器自动生成 __init__、__repr__、__eq__ 等魔术方法,让数据类定义从十几行样板代码缩减到几行字段声明。本工具基于 quicktype-core 在浏览器本地运行,使用 just-types 和 no-comments 渲染选项,为 Python 生成纯净的 dataclass 代码。输出包含 from dataclasses import dataclass 与 from typing import Any, List, Optional 等必要导入,可以直接配合 Python 3.7+ 项目使用。

类型推断是 JSON 转 Python 的核心。工具会把 JSON 的基本类型映射到 Python 的标准类型:字符串映射为 str,整数映射为 int,浮点数映射为 float,布尔值映射为 bool,数组映射为 List[T](元素按首项推断),嵌套对象映射为独立的 @dataclass,null 值映射为 Optional[Any]。对于嵌套对象,工具会自动为每个层级创建新的 dataclass,并按字段名首字母大写命名,例如 address 字段会生成 Address 类,items 数组中的对象会生成 Item 类。

与一些需要把 JSON 上传到服务器处理的在线工具不同,本工具的所有计算都在浏览器内完成。quicktype-core 通过 Web Worker 加载和执行,JSON 解析、类型推断、Python 代码生成、文件下载都在本地进行,不向任何服务器发送数据。这对于包含 API key、用户隐私字段或未上线业务结构的 JSON 尤其重要,关闭页面后数据即从内存中清除。

生成后的代码可直接放到 Python 项目中使用。dataclass 是标准库无需额外安装;typing 模块从 Python 3.5 起可用。如果使用 Python 3.9+,可手动把 List[str] 替换为内置的 list[str]、Optional[str] 替换为 str | None,享受更现代的类型注解写法。如果项目使用 Pydantic 做数据校验(如 FastAPI),只需把 @dataclass 改成 class Xxx(BaseModel): 即可无缝切换为 Pydantic 模型。

需要注意的是,自动生成的代码是起点而不是终点。工具按 JSON 样本推断类型,无法判断业务上的精确类型(例如 URL、Email、ID 等语义类型都会被统一推断为 str)。对于 snake_case 的 JSON 字段,Python dataclass 字段会保持原样生成,你可能需要手动改字段名为 snake_case 或通过 Pydantic alias_generator 配置映射。建议把生成结果作为初稿,再根据项目规范微调字段名、类型、默认值和验证逻辑。

另一个值得关注的对比维度是 dataclass vs Pydantic BaseModel vs attrs vs TypedDict。dataclass 是 Python 标准库,零依赖、纯数据建模、不做运行时校验,适合做内部数据传输对象(DTO)和 ORM 模型。Pydantic BaseModel 在 dataclass 基础上加了类型驱动的校验、序列化和设置管理,是 FastAPI 的默认数据模型层。attrs 是 dataclass 的前身,提供更多配置项(slots、validators、converters)。TypedDict 是 typing 模块的轻量方案,仅做类型提示不做运行时约束,适合与 dict 兼容场景。本工具默认生成 dataclass,可在编辑器中一键替换为上述任一形态。

与 Java 转 JSON / TypeScript 转 JSON 这类在线工具相比,JSON 转 Python 在数据科学生态里有独特价值。pandas 的 read_json、DataFrame.from_records、json_normalize 等函数经常需要传入类字典的对象列表;scikit-learn 的 Pipeline.fit 接受带字段约束的数据结构;Jupyter Notebook 在探索性分析时用 dataclass 包装 JSON 响应可以显著提升代码可读性。本工具生成的代码可以无缝接入这些生态,把 JSON 样本作为单一事实源。

Python 生态里还有更多 JSON ↔ dataclass 互转的可选工具:marshmallow(侧重序列化与反序列化校验)、cattrs(结构化转换库)、pydantic(运行时校验 + IDE 提示)、apischema(无需 dataclass 装饰即可生成 JSON Schema)。本工具生成的纯 dataclass 是这些库的天然输入:复制生成的类后,marshmallow 用户加 Schema(Model) 即可,cattrs 用户用 cattrs.structure(data, Model) 即可完成转换。建议把本工具作为类型生成的起点,再根据项目架构叠加合适的生态库。

在 CLI 与自动化场景里,JSON 转 Python 也有独特的价值。argparse 解析命令行参数后通常需要二次包装成 dict,再传递给业务函数;用生成的 dataclass 替代 dict 可以让脚本更健壮。同样地,配置文件(config.json / settings.json)经 dataclass 包装后,可以让运维同事在 IDE 里直接看到字段含义与类型,配合 mypy 在 CI 阶段提前发现配置错误。

最后一个常被忽视的细节是性能与可维护性的平衡。本工具生成的 dataclass 是不可变快照的最佳载体:加 (frozen=True) 后实例无法修改,多线程共享安全;加 (slots=True)(Python 3.10+)后内存占用降低 40% 左右。生成的 List[str] 字段如果要避免共享同一个空列表陷阱,必须用 field(default_factory=list) 而不是 = [],本工具生成的代码已经遵循这一最佳实践。

适用场景

  • REST API 联调:把后端返回的 JSON 响应转成 Python @dataclass,配合 requests + json 做强类型 HTTP 请求解析 配合 mypy 或 pyright 可在 IDE 中实时获得属性补全和类型检查,避免常见拼写错误。
  • FastAPI 请求/响应模型:把 API 接口文档中的示例 JSON 转成 Pydantic BaseModel 模板,统一前后端模型定义 推荐在 FastAPI 项目中开启 response_model 参数,让 OpenAPI 文档自动生成字段示例与校验规则。
  • Django Ninja / DRF 序列化器:把 JSON 响应转成 dataclass 后手动加 DRF 的 ModelSerializer 或 Ninja 的 Schema 派生类 DRF 的 ModelSerializer 可基于 dataclass 自动生成校验规则,Ninja 的 Schema 也可直接复用本工具的输出。
  • 爬虫数据建模:把网页抓取的 JSON 数据转成 dataclass,避免使用 dict 动态访问导致的字段遗漏和拼写错误 配合 requests-html、playwright 等异步爬虫库时,dataclass 还能减少 JSON 反序列化的样板代码量。
  • 机器学习特征定义:把 scikit-learn / pandas 训练数据的 JSON schema 转成 dataclass,规范特征字段名和类型 sklearn Pipeline.fit(X, y) 接受带类型注解的数据结构,dataclass + asdict 是与 pandas DataFrame 互转的高效桥梁。
  • 配置文件反序列化:把 YAML/JSON 配置文件示例转成 dataclass,配合 Hydra / OmegaConf 做配置强类型读取 配合 Hydra 的 @dataclass 装饰,配置可在 IDE 中享受自动补全,避免 YAML 配置中常见的拼写错误和类型不一致。
  • Jupyter Notebook 临时结构:把探索性数据分析中的 JSON 样本转成 dataclass,方便在 Notebook 里做属性访问和 IDE 补全 Notebook 中用 dataclass 包装 JSON 响应让探索性分析的代码可读性显著提升,方便后续重构为生产模块。
  • 微服务接口定义:把 gRPC/HTTP 服务的请求体示例 JSON 转成 Python 类型,统一服务端模型定义 gRPC 的 protobuf 转 JSON 后,再转 dataclass 可作为后端服务的强类型模型,与前端 TypeScript 类型对齐。
  • CLI 工具开发:把命令行配置 JSON 示例转成 dataclass,配合 argparse 做配置反序列化和校验 argparse Namespace 转 dataclass 仅需 dataclass(**vars(args)) 一行,比手写解析逻辑更安全。
  • 测试数据构造:把后端返回的真实 JSON fixture 转成 Python 类型,在 pytest 中用 dataclasses.replace 做测试数据驱动 pytest 的 parametrize 装饰器配合 dataclass 可构造带类型的测试夹具,失败信息更清晰。
  • 日志结构化解析:把 ELK / Loki 抓取的 JSON 日志转成 dataclass,方便做过滤和告警规则 ELK 的 JSON 日志经 dataclass 包装后,可做精确字段过滤和聚合查询,比 dict 访问更安全。
  • 配置中心迁移:把 Apollo / Nacos / Consul 的 JSON 配置转成 Python 类型,用于服务端配置热加载 Apollo / Nacos 的 JSON 配置可与 dataclass 双向校验,配置变更时可立即发现缺字段、类型不匹配等问题。
  • 跨语言协作:后端 Python 与前端 TypeScript 联调,同一份 JSON 分别转成 Python dataclass 和 TS interface 保持两端一致 跨语言协作场景下,Python 后端 + TS 前端共享同一份 JSON 样本,分别生成 dataclass 和 interface,保持字段名一致。
  • 数据库迁移:把 MongoDB / PostgreSQL JSONB 字段导出的 JSON 文档转成 Python 模型,作为 ORM 实体定义的参考 MongoDB 的 JSONB 文档导出后转 dataclass 可作为 ORM 实体的字段参考,比直接读 MongoDB 文档更易维护。
  • 区块链/Web3:把链上 JSON RPC 响应转成 Python dataclass,用于 web3.py 等 SDK 的类型封装 web3.py、eth-brownie 等以太坊 SDK 都支持 dataclass 风格的返回值,方便二次封装。
  • 数据科学 ETL:把上游 JSON 数据源转成 dataclass 后用 pandas DataFrame.from_records 转为表格做下游分析 pandas DataFrame.from_records([asdict(d) for d in dataclass_list]) 一行完成嵌套结构到表格的转换。
  • OpenAPI Schema 校验:把 OpenAPI 文档里的 example JSON 转成 Python 模型,再写一遍 pydantic 校验逻辑 OpenAPI example 字段可直接复制本工具输入,生成的 Pydantic 模型可自动校验 API 文档的一致性。
  • 教学示例:Python 课程中把示例 JSON 转成 dataclass,讲解 typing 模块、类型注解、__init__ 自动生成等概念 Python 课程中讲解 typing 模块、__init__ 自动生成、slots 等概念时,dataclass 是最直观的演示载体。
  • 字段命名转换:把 snake_case 的 JSON API 响应转成 dataclass 后手动改字段名,或通过 Pydantic alias_generator 做字段映射 Pydantic 的 alias_generator 可在 BaseModel 中配置 camelCase ↔ snake_case 自动映射,避免手写 alias。

使用方法

  1. 在左侧编辑器粘贴 JSON 内容,或点击上传按钮选择 .json / .txt 文件
  2. 等待 400ms 自动转换,右侧即可看到生成的 Python dataclass 代码
  3. 如果 JSON 格式错误,点击「修复 JSON」按钮自动修复常见语法问题
  4. 点击「复制」粘贴到项目 models/ 目录,或点击「下载」保存为 model.py 文件

功能特点

  • 本地浏览器转换:JSON 解析与 Python 代码生成全部在浏览器内完成,输入数据不上传任何服务器,敏感 API 响应也能放心使用
  • dataclass 注解输出:生成 @dataclass 装饰的标准 Python 类,配合 from __future__ import annotations 可直接用于 Python 3.7+ 项目
  • 自动类型推断:str / int / float / bool / List[T] / Dict[str, Any] / Optional[Any] 按 JSON 值自动映射,无需手动指定字段类型
  • 嵌套对象自动拆分:嵌套 JSON 对象生成独立 @dataclass 类,按字段名首字母大写命名(如 address -> Address),避免类型重复定义
  • List 泛型自动展开:JSON 数组自动转 List[T],元素类型按数组首个非 null 元素推断,例如 ["a","b"] -> List[str]、[{...},{...}] -> List[Item]
  • Optional 可选字段:null 字段生成 Optional[Any] 兜底,确保类型注解能正确表达字段可能缺失的情况
  • 400ms 防抖自动转换:粘贴后自动触发转换,右侧实时预览 Python 代码,减少等待和多余点击
  • JSON 错误一键修复:自动修复尾随逗号、单引号、缺引号等常见格式错误,修复成功后继续生成代码
  • 复制与下载:一键复制全部 Python 代码,或下载为 model.py 文件直接放入项目根目录或 models 子模块
  • localStorage 输入历史:自动保存最近输入到本地,刷新或误关页面后可快速恢复继续编辑
  • 响应式分栏编辑:左侧输入 JSON,右侧查看 Python 代码,支持拖拽调整面板宽度,适配大屏和移动端
  • 支持 Pydantic / attrs / TypedDict 二次改造:生成的 dataclass 可一键加 BaseModel 或 attrs 装饰器适配 FastAPI、Django Ninja、pydantic-settings 等框架

代码示例

Python:用 requests 解析 API 响应到生成的 dataclass

python
# requirements.txt
# requests>=2.31

from dataclasses import dataclass
from typing import Any, List, Optional
import json
import requests


@dataclass
class Address:
    city: str
    zip: str


@dataclass
class User:
    id: int
    name: str
    active: bool
    address: Address
    tags: List[str]
    label: Optional[Any] = None


def main() -> None:
    resp = requests.get("https://api.example.com/users/1", timeout=10)
    resp.raise_for_status()

    # 直接把 JSON 字符串反序列化为 dataclass 实例
    user: User = User(**resp.json())

    # 强类型访问:IDE 补全、mypy/pyright 静态检查
    print(f"{user.name} lives in {user.address.city}")
    print(f"tags: {user.tags}")


if __name__ == "__main__":
    main()

Python:FastAPI 用生成的模型做请求体校验(Pydantic 改造版)

python
# pip install fastapi 'pydantic>=2'

from typing import List, Optional
from fastapi import FastAPI
from pydantic import BaseModel


class Address(BaseModel):
    city: str
    zip: str


class User(BaseModel):
    id: int
    name: str
    email: str
    active: bool = True
    address: Address
    tags: List[str] = []
    label: Optional[str] = None


app = FastAPI()


@app.post("/users")
async def create_user(user: User) -> dict:
    # FastAPI 自动用 User 校验请求体,字段类型/必填错误会返回 422
    return {"id": user.id, "name": user.name}


@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int) -> User:
    # response_model 自动序列化响应,OpenAPI 文档自动生成
    return User(
        id=user_id,
        name="Alice",
        email="alice@example.com",
        active=True,
        address=Address(city="Beijing", zip="100000"),
        tags=["fastapi", "pydantic"],
    )

Python:爬虫数据建模(dataclass + JSON 反序列化)

python
from dataclasses import dataclass, asdict
from typing import List, Optional
import json


@dataclass
class Author:
    id: int
    name: str


@dataclass
class Article:
    id: int
    title: str
    url: str
    author: Author
    score: int
    tags: List[str]
    summary: Optional[str] = None


def parse_articles(raw_json: str) -> List[Article]:
    """把爬虫抓取的 JSON 字符串反序列化为 Article 列表。"""
    payloads = json.loads(raw_json)
    return [Article(**payload) for payload in payloads]


if __name__ == "__main__":
    raw = '''[
        {
            "id": 1,
            "title": "Hello dataclass",
            "url": "https://example.com/p/1",
            "author": {"id": 10, "name": "Alice"},
            "score": 95,
            "tags": ["python", "typing"],
            "summary": "quick intro"
        }
    ]'''

    articles = parse_articles(raw)
    for art in articles:
        # IDE 自动补全 author.name、tags、summary
        print(f"[{art.score}] {art.title} - {art.author.name}")
        print(f"  tags: {art.tags}")

        # 需要 dict 形式(如写入 MongoDB)时用 asdict
        doc = asdict(art)
        print(f"  mongo doc: {doc}")

Python:机器学习特征定义(pandas + sklearn 集成)

python
# pip install pandas scikit-learn

from dataclasses import dataclass, field, asdict
from typing import List, Optional
import json
import pandas as pd
from sklearn.ensemble import RandomForestClassifier


@dataclass
class FeatureSchema:
    """样本特征 schema,由 JSON 转 Python 工具生成后微调。"""
    user_id: int
    age: int
    city: str
    plan: str
    monthly_spend: float
    active: bool
    tags: List[str] = field(default_factory=list)
    last_login: Optional[str] = None


def features_to_frame(samples: List[dict]) -> pd.DataFrame:
    """把 JSON 列表转为 DataFrame,自动使用 dataclass 字段名做列名。"""
    rows = [asdict(FeatureSchema(**row)) for row in samples]
    df = pd.DataFrame(rows)
    # 类别字段 one-hot 编码
    df = pd.get_dummies(df, columns=["city", "plan"], drop_first=True)
    return df


def main() -> None:
    raw = json.loads('''[
        {"user_id": 1, "age": 25, "city": "Beijing", "plan": "pro", "monthly_spend": 99.0, "active": true, "tags": ["new"]},
        {"user_id": 2, "age": 40, "city": "Shanghai", "plan": "free", "monthly_spend": 0.0, "active": false, "tags": []}
    ]''')

    X = features_to_frame(raw)
    y = [1, 0]  # 假设标签:付费用户 / 免费用户

    model = RandomForestClassifier(n_estimators=100, random_state=42)
    model.fit(X, y)

    print("feature_columns:", list(X.columns))
    print("importances:", dict(zip(X.columns, model.feature_importances_)))

最佳实践

JSON 样本尽量包含完整字段示例值

工具按 JSON 样本推断类型,如果某个字段在样本中始终为 null,会被兜底为 Optional[Any]。建议在生成前给所有关键字段提供一个示例值(如 "description": "sample" 推断为 str、"count": 0 推断为 int),生成后再删除示例值即可获得精确类型。

复杂 JSON 优先拆分为多个 dataclass

本工具默认会把嵌套对象递归展开为独立类,但单个文件的字段数超过 50 时建议手动拆分到 models/user.py、models/order.py 等子模块。这样做有三个好处:① 编译更快;② 团队成员分工更清晰;③ 循环引用更易处理。

需要运行时校验时切到 Pydantic BaseModel

如果项目用 FastAPI 或需要严格的请求体验证,建议在生成 dataclass 后立即改造成 BaseModel:把 @dataclass 改成 class Xxx(BaseModel):,把 from dataclasses import dataclass 改成 from pydantic import BaseModel,其余字段类型保持不变。Pydantic v2 用 Rust 重写后性能比 dataclass 校验还快。

配合 mypy 在 CI 阶段做类型检查

在 CI 流水线中加入 mypy src/ --strict 命令,可捕获字段拼写错误、类型不一致、Optional 误用等问题。本工具生成的 dataclass 完全符合 PEP 484 规范,mypy 零警告通过。结合 pre-commit hook 可让开发者提交前自动检查。

避免在 dataclass 字段中使用可变默认值

tags: List[str] = [] 是常见错误,会导致所有实例共享同一个空列表。本工具生成的代码已用 field(default_factory=list) 处理,但生成后手动添加新字段时务必遵守这一规则。Python 类型系统会延迟到运行时才暴露这个 bug,静态检查器也未必能发现。

下载的 model.py 建议放到独立的 models 包

推荐目录结构:src/models/__init__.py + src/models/user.py + src/models/order.py。这样做:① 业务代码用 from models import User 简化 import;② 团队可按模块认领不同 dataclass;③ pytest fixture 可统一在 conftest.py 中导入。

敏感 JSON 必须本地处理

如 JSON 包含 API key、token、未公开业务结构、未发布产品规格等敏感信息,请务必使用本工具(本地浏览器运行)而非需要上传的在线工具。本工具不向任何服务器发送数据,关闭页面即清除内存中的所有 JSON 内容。

Python 3.10+ 启用 slots 节省内存

如需大量实例化 dataclass(如爬虫百万级数据建模),推荐 Python 3.10+ 启用 @dataclass(slots=True)。启用后实例不再使用 __dict__,内存占用降低 30-40%,属性访问速度提升约 20%。本工具生成的代码默认未启用,可在生成后手动加 slots=True。

常见问题

怎么把 JSON 转成 Python dataclass?

在左侧编辑器粘贴 JSON 内容,或点击上传按钮选择 .json / .txt 文件。工具会在 400ms 内自动调用 quicktype-core 生成 Python 代码,右侧显示带 @dataclass 装饰器的类定义。如 JSON 格式错误,可点击「修复 JSON」按钮自动修复后再转换。 如果 400ms 内未自动转换,可手动点击工具栏 Convert 按钮触发。

生成的 Python 代码包含 dataclass 注解吗?

包含。工具使用 quicktype-core 的 just-types 渲染模式,为 Python 生成 @dataclass 装饰器、from dataclasses import dataclass 与 from typing import Any, List, Optional 等必要导入,可直接配合 Python 3.7+ 的 dataclasses 标准库使用。如果你不需要 dataclass,可手动移除装饰器和导入语句,改写为普通 class。 如需更激进的类型(如 Decimal、UUID、datetime),建议结合 Pydantic BaseModel 一起使用。

支持哪些 JSON 数据结构?

支持所有合法 JSON 结构:基本类型(null、boolean、number、string)、数组(一维或多维)、嵌套对象(任意深度)。JSON 对象会生成根 dataclass,JSON 数组会生成 List[RootClass] 类型的根容器。不支持 JavaScript 对象字面量、函数、Symbol、undefined 等非 JSON 值。 quicktype-core 同时支持 JSON Schema、JSON 示例、TypeScript 输入作为类型源。

JSON 字段类型如何映射到 Python 类型?

字符串映射为 str,整数映射为 int,浮点数映射为 float,布尔值映射为 bool,数组映射为 List[T](元素类型按首项推断),嵌套对象映射为独立 @dataclass,null 映射为 Optional[Any]。具体映射规则可参考页面下方的「JSON 类型到 Python 类型映射速查表」。 Python 3.9+ 可使用内置 list[str]、dict[str, Any] 语法,无需从 typing 模块导入。

null 值会生成什么类型?

JSON 中的 null 值会生成 Optional[Any],表示该字段可能缺失或类型不确定。如果你已经知道字段实际类型,可在源 JSON 中给出一个示例值(如 "field": "" 推断为 str),生成后再根据业务需求改为 Optional[str] 等更精确的类型。 如果 JSON 中存在大量 null 字段,可在源数据中替换为示例值(如空字符串、0、false)以获得更精确的推断结果。

数组会转成 List 吗?

会。JSON 数组统一转换为 Python List[T] 泛型,元素类型按数组首项自动推断。例如 ["a","b"] 生成 List[str],[1,2,3] 生成 List[int],[{...},{...}] 生成 List[Item]。空数组 [] 默认生成 List[Any]。 多维数组会递归展开为 List[List[T]],例如 [[1,2],[3,4]] 转为 List[List[int]]。

嵌套对象会怎么处理?

每个嵌套对象都会生成独立的 @dataclass 类,命名规则为字段名首字母大写。例如根对象包含 address 字段,会同时生成 Root 和 Address 两个 dataclass,Root 中通过 address: Address 引用。相同结构的对象会被复用同一类型,避免重复定义。 同一结构的对象会被合并为同一个 @dataclass 类,避免重复定义;如需拆分可在生成后手动复制为多个类。

可以自定义生成的类名吗?

quicktype-core 默认使用 JSON 源名称(如 User)作为根类名。你可以在生成后手动修改类名及引用位置。下载的 model.py 文件名同样可在保存时按需重命名。 根类名默认为 JsonRootClass,可在生成后用 IDE 的 Rename 功能批量修改为业务语义化命名(如 User、Order)。

生成的代码可以直接用到项目里吗?

可以直接使用,但需确保 Python 3.7+ 环境(dataclasses 是 3.7 标准库)。代码依赖 typing 模块,Python 3.5+ 即可。如需在 Python 3.9+ 中使用更简洁的内置泛型 list[str]、dict[str, Any],可手动替换 List[str] 等导入类型。 如使用 uv、poetry、pdm 等现代包管理工具,依赖声明方式可能略有不同,但 dataclass 本身无需额外依赖。

可以转成 Pydantic BaseModel 而不是 dataclass 吗?

工具默认生成 @dataclass。如需 Pydantic BaseModel 用于 FastAPI 请求体校验,可:① 把 from dataclasses import dataclass 改为 from pydantic import BaseModel;② 把 @dataclass 改为 class Xxx(BaseModel):;③ 把 Optional[Any] 改为 Optional[具体类型] 或保留默认即可。Pydantic v2 也支持直接继承 dataclass。 Pydantic v2 同时支持 dataclass 风格:可直接给 dataclass 加 @dataclass 装饰器后传给 FastAPI,无需继承 BaseModel。

生成 FastAPI 请求体模型的完整步骤?

FastAPI 推荐使用 Pydantic BaseModel。生成 dataclass 后三步改写:① @dataclass 改成 class Xxx(BaseModel):;② 删除 dataclasses 导入,加 from pydantic import BaseModel;③ 在 FastAPI 路由中用 user: Xxx = Body(...) 接收请求体即可自动校验。 进阶用法:在 FastAPI 中使用 Annotated[User, Body(...)] 可进一步控制请求体的媒体类型与校验行为。

数据会上传到服务器吗?隐私安全吗?

完全本地浏览器运行。JSON 解析、Python 代码生成、文件下载全部在浏览器内通过 JavaScript 完成,输入的 JSON 数据和生成的 Python 代码都不会上传到任何服务器,也不会被记录或缓存到云端。包含 API key、token、未公开业务字段的敏感 JSON 可以放心使用,关闭页面即清除。 关闭或刷新页面后,所有输入、输出、localStorage 历史均从内存清除,不会有任何残留。

需要注册或登录吗?

不需要。工具完全免费,无需注册、登录或授权。打开页面即可使用,所有功能在浏览器本地可用。 工具完全免费、无广告、无需授权,也不会在生成结果中插入水印或追踪代码。

JSON 格式错误怎么办?

工具会自动检测 JSON 合法性,错误时会在右侧显示红色错误提示,并提供「修复 JSON」按钮。点击后可自动修复常见错误:末尾多余逗号、单引号替换为双引号、缺失引号的 key 补全引号、注释移除等。修复成功后会继续生成 Python 代码。 修复后的 JSON 不会改变原有语义,仅做格式修复;如修复结果不理想可手动撤销重新粘贴。

生成大 JSON 会不会卡?

工具无显式行数限制,但浏览器对超大 JSON 的解析和渲染会变慢。建议:① 拆分 JSON 后分批转换;② 一次只关注一个嵌套层级;③ 如需批量生成 100+ 类,建议使用 quicktype 命令行工具(pip install quicktype)或 datamodel-code-generator 处理。 datamodel-code-generator(pip install datamodel-code-generator)是另一款强力的命令行工具,支持直接输出 Pydantic 模型。

故障排查

提示「请输入 JSON 数据」或右侧为空

左侧输入框为空或只有空白字符。确保已粘贴有效的 JSON 内容,或点击上传按钮选择 .json / .txt 文件,也可以点击示例按钮加载内置样例。

提示 JSON 解析失败

常见原因:末尾有多余逗号、使用了单引号而非双引号、key 未加双引号、包含 JavaScript 注释。点击「修复 JSON」按钮可自动修复部分错误;如果仍失败,请先用 JSON 格式化工具校验。

生成的字段类型不够精确

工具按 JSON 样本推断类型,例如所有整数都是 int、所有字符串都是 str。如果你需要 Decimal、datetime、UUID、EmailStr 等更精确类型,请在生成后手动修改字段类型,并在 Pydantic 模式下使用 Field 约束。

null 字段生成了 Optional[Any] 而不是 Optional[str]

因为 JSON null 无法推断具体类型,工具会安全地兜底为 Optional[Any]。如果你知道字段实际类型,可在源 JSON 中替换为示例值(如 "field": "")重新生成,再手动改为 Optional[str]。

运行时提示缺少 typing 模块

typing 是 Python 3.5+ 标准库,dataclass 是 Python 3.7+ 标准库。检查 Python 版本:python --version。如版本过低,请升级到 Python 3.9+ 以获得更好的泛型语法(list[str]、dict[str, Any])。

想生成 Pydantic BaseModel 但又不想手动改写

工具默认输出 dataclass。如项目必须用 Pydantic,有两条路:① 复制生成结果后用 IDE 的 Find & Replace 把 @dataclass 改为 class Xxx(BaseModel):,把 from dataclasses import dataclass 改为 from pydantic import BaseModel;② 改用 datamodel-code-generator 命令行工具(pip install datamodel-code-generator),它支持直接输出 Pydantic 模型。

下载的 .py 文件在项目中 import 报错

可能原因:① Python 版本低于 3.7(无 dataclasses);② 项目有 mypy 严格模式但字段未声明类型;③ 类名与项目中其他模块冲突。解决:升级 Python 到 3.9+、确保所有字段带类型注解、用 import as 重命名冲突类。

snake_case JSON 字段与 Python 命名风格不一致

工具会保持 JSON 原字段名生成 Python 字段。Python 推荐 snake_case 命名,与 JSON 字段风格天然一致;如果需要 camelCase(如对接 JavaScript 前端),可手动改字段名或通过 Pydantic alias_generator 配置别名映射。

超大 JSON 转换时页面卡顿

建议把 JSON 拆成多个独立模块分别转换,或只提取需要建模的部分。浏览器渲染大量 dataclass 时会消耗较多内存,超过 10MB 的 JSON 推荐使用 quicktype 命令行工具(npx quicktype)或 datamodel-code-generator 处理。

FastAPI 中请求体字段校验不通过(422 错误)

FastAPI 默认使用 Pydantic 做严格校验,缺字段或类型不匹配会返回 422。解决:① 把字段类型改为 Optional[类型] = None 让字段可选;② 用 Field(default=..., description=...) 设置默认值和文档;③ 检查请求体 Content-Type 必须是 application/json。

术语表

dataclass
Python 3.7+ 标准库装饰器(@dataclass),用于自动生成 __init__、__repr__、__eq__ 等魔术方法。本工具生成的即为 @dataclass 类,例如 @dataclass class User: id: int; name: str。 本质是把「数据存储」与「数据操作」解耦,让 class 专注于描述数据字段,由装饰器自动生成样板方法。
typing 模块
Python 类型注解标准库,提供 List、Dict、Optional、Any、Union 等泛型类型。本工具生成的 List[T]、Optional[Any] 均来自 typing 模块。Python 3.9+ 可直接使用内置 list、dict。 与 collections.abc、contextlib 等并列,是 Python 标准库里做静态类型约束的核心模块;PEP 484 起逐步成为大型项目的标配。
Optional[T]
typing 模块的可选类型,等价于 Union[T, None],表示字段可能为 None。本工具把 JSON null 映射为 Optional[Any],可手动改为 Optional[str] 等更精确类型。 注意 Optional[T] 与 T = None 默认值不同:前者是类型层面的 None 表达,后者是值层面的默认设置。
List[T]
Python 泛型列表类型。本工具把 JSON 数组自动映射为 List[T],例如字符串数组映射为 List[str]、对象数组映射为 List[Item]。Python 3.9+ 可写为 list[T]。 工具默认从 typing 模块导入,与 Python 3.9+ 的内置 list[T] 等价;如团队倾向新语法,可一键替换 import。
Any
typing 模块的特殊类型,表示接受任意类型。本工具对 null 值和空数组默认使用 Any 兜底,避免类型推断错误。 频繁使用 Any 会让 mypy / pyright 失去检查能力,建议在确定字段类型后改为精确类型,例如 Optional[str]、List[int]。
Pydantic BaseModel
Pydantic 库的数据模型基类,提供运行时数据校验、序列化和反序列化。本工具生成的 dataclass 可一键改造为 BaseModel 用于 FastAPI 请求体验证。 Pydantic v2 用 Rust 重写了核心校验逻辑,性能比 v1 提升 5-50 倍;本工具生成的 dataclass 也可继承 BaseModel 享受这一加速。
FastAPI
现代 Python Web 框架,依赖 Pydantic 做请求体自动校验。本工具生成的 dataclass 可作为 FastAPI 路由函数的请求/响应模型模板。 基于 Starlette + Pydantic,自动生成 OpenAPI 文档,是当下 Python 后端 API 框架的事实标准之一。
PEP 557
Python 增强提案,定义 dataclass 装饰器的语法与行为。本工具生成的代码完全符合 PEP 557 规范。 该提案于 2017 年由 Eric V. Smith 发起,借鉴了 attrs、Haskell record 等已有方案的设计思想。
类型注解 (Type Hint)
Python 函数参数和变量后用 : Type 标注的类型提示。本工具生成的 dataclass 字段均带类型注解,配合 mypy / pyright 可做静态类型检查。 注解本身不影响运行时行为,仅用于 IDE 提示、mypy / pyright 静态检查、运行时校验库(如 Pydantic)。
PEP 484
Python 类型注解规范提案,定义 typing 模块和泛型语法。本工具生成的 List[T]、Optional[T] 等遵循 PEP 484。 该提案由 Guido van Rossum、Jukka Lehtosalo、Łukasz Langa 等人联合起草,是 Python 类型注解体系的奠基性文档。
from __future__ import annotations
PEP 563 引入的延迟注解求值语句,让所有注解以字符串形式存储,避免前向引用问题。本工具生成的 dataclass 可加这行让类型注解引用顺序无关。 启用后所有注解以字符串形式延迟求值,避免前向引用(forward reference)问题,并让 dataclass 字段顺序与引用顺序解耦。
model.py
本工具下载的默认文件名,符合 Python 项目惯例。可重命名为 user.py、schemas.py 等符合项目结构的命名。 与 Django 的 models.py、Flask 的 models.py 命名风格保持一致;多模型项目可在 models 包下拆为 user.py、order.py 等子模块。

JSON 类型到 Python 类型映射速查表

工具根据 JSON 值的类型自动推断对应的 Python 类型:

JSON 值示例生成 Python 类型说明
nullOptional[Any]null 值类型不确定,用 Optional[Any] 兜底,可手动改为 Optional[str] 等精确类型
true / falseboolJSON 布尔值直接映射为 Python bool
42intJSON 整数默认映射为 Python int(任意精度)
3.14floatJSON 浮点数默认映射为 Python float(双精度)
"hello"strJSON 字符串映射为 Python str(Unicode 字符串)
["a","b"]List[str]字符串数组映射为 List[str],Python 3.9+ 可写 list[str]
[1,2,3]List[int]整数数组映射为 List[int]
[{...},{...}]List[Item]对象数组按首个元素生成对应 @dataclass,再用 List 包装
[]List[Any]空数组无法推断元素类型,用 Any 兜底
{...} 嵌套对象独立 @dataclass嵌套对象生成独立 @dataclass 类,字段名首字母大写命名

生成的 Python 代码结构说明

quicktype-core 为 Python 生成的典型代码包含以下部分:

代码部分示例作用
from dataclasses import dataclassfrom dataclasses import dataclass引入 dataclass 装饰器(Python 3.7+ 标准库)
from typing import Any, List, Optionalfrom typing import Any, List, Optional引入 typing 模块的类型注解:Any 任意类型、List 泛型列表、Optional 可选类型
@dataclass@dataclass class User:装饰器让类自动生成 __init__、__repr__、__eq__ 等方法
字段声明id: int name: str带类型注解的字段定义,自动成为 __init__ 参数
List[T] 字段tags: List[str]表示 JSON 数组字段,元素类型按数组首项推断
Optional[Any] 字段label: Optional[Any] = None表示可能为 null 的字段,默认值 None 让实例化更友好
嵌套 @dataclassaddress: Address引用同模块下其他 @dataclass 类,构成强类型结构

Python 数据建模方案选型对比

工具默认输出 @dataclass,但 Python 生态还有多种数据建模方案可选,根据项目需求选择:

方案导入方式运行时校验典型场景
@dataclassfrom dataclasses import dataclass无(仅类型注解)内部 DTO、ORM 模型、纯数据容器;Python 3.7+ 零依赖首选
Pydantic BaseModelfrom pydantic import BaseModel强(自动类型转换 + 自定义 validator)FastAPI 请求/响应体、配置文件校验、跨进程数据传输
attrs @attr.sfrom attrs import frozen, field可选 validators需要 slots / frozen / 自定义转换器的高性能场景
TypedDictfrom typing import TypedDict无(仅类型注解,运行时仍为 dict)需要与 dict 完全兼容的轻量类型提示;如 mypy 静态检查
dataclasses-jsonfrom dataclasses_json import DataClassJsonMixin可与 Pydantic 配合dataclass 加 .to_json() / .from_json() 方法的反序列化场景
msgpack + dataclassimport msgpack无(序列化层)高性能二进制传输场景(msgpack 比 JSON 小 30%-50%)

Python 版本与 dataclass 特性对照表

不同 Python 版本对 dataclass、typing、Pydantic 的支持程度不同,按版本选型:

Python 版本dataclass 支持typing 支持推荐用途
3.6 及以下无(需 pip install dataclasses)typing 基础可用不推荐;建议升级到 3.9+
3.7 - 3.8@dataclass 装饰器List[T]、Optional[T] 需 import typing最低可用版本,向后兼容主流项目
3.9 - 3.10@dataclass + field + asdict 完整可使用内置 list[T]、dict[str, Any],PEP 585推荐:现代类型注解写法 + 完整 dataclass
3.10+@dataclass(slots=True) 节省内存PEP 604:int | None 替代 Optional[int]最佳:slots + 现代 union 语法
3.11+@dataclass + slots + frozen 性能优化Self、TypeVarTuple、Concatenate 等高级特性新项目首选;老项目可逐步升级
3.12+PEP 695 类型参数语法(type List[T])完全类型注解新语法前沿特性尝鲜;生产环境建议 3.11+

Privacy & Security

本 JSON 转 Python 工具所有操作完全在你的浏览器本地完成:JSON 解析、Python 代码生成、文件下载全部通过浏览器 JavaScript 在客户端执行,不会通过网络向任何服务器发送 JSON 内容、上传的文件或生成的代码。文件上传使用浏览器原生 FileReader API 直接读取到内存,不经过任何中间服务。不使用 Cookie 追踪,不收集任何用户输入或使用数据。关闭或刷新页面后,所有输入和输出内容自动从内存清除。适合处理含 API 密钥、token、敏感业务数据的 JSON。

Authoritative References