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。
使用方法
- 在左侧编辑器粘贴 JSON 内容,或点击上传按钮选择 .json / .txt 文件
- 等待 400ms 自动转换,右侧即可看到生成的 Python dataclass 代码
- 如果 JSON 格式错误,点击「修复 JSON」按钮自动修复常见语法问题
- 点击「复制」粘贴到项目 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 反序列化)
pythonfrom 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 类型 | 说明 |
|---|---|---|
null | Optional[Any] | null 值类型不确定,用 Optional[Any] 兜底,可手动改为 Optional[str] 等精确类型 |
true / false | bool | JSON 布尔值直接映射为 Python bool |
42 | int | JSON 整数默认映射为 Python int(任意精度) |
3.14 | float | JSON 浮点数默认映射为 Python float(双精度) |
"hello" | str | JSON 字符串映射为 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 dataclass | from dataclasses import dataclass | 引入 dataclass 装饰器(Python 3.7+ 标准库) |
from typing import Any, List, Optional | from 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 让实例化更友好 |
嵌套 @dataclass | address: Address | 引用同模块下其他 @dataclass 类,构成强类型结构 |
Python 数据建模方案选型对比
工具默认输出 @dataclass,但 Python 生态还有多种数据建模方案可选,根据项目需求选择:
| 方案 | 导入方式 | 运行时校验 | 典型场景 |
|---|---|---|---|
@dataclass | from dataclasses import dataclass | 无(仅类型注解) | 内部 DTO、ORM 模型、纯数据容器;Python 3.7+ 零依赖首选 |
Pydantic BaseModel | from pydantic import BaseModel | 强(自动类型转换 + 自定义 validator) | FastAPI 请求/响应体、配置文件校验、跨进程数据传输 |
attrs @attr.s | from attrs import frozen, field | 可选 validators | 需要 slots / frozen / 自定义转换器的高性能场景 |
TypedDict | from typing import TypedDict | 无(仅类型注解,运行时仍为 dict) | 需要与 dict 完全兼容的轻量类型提示;如 mypy 静态检查 |
dataclasses-json | from dataclasses_json import DataClassJsonMixin | 可与 Pydantic 配合 | dataclass 加 .to_json() / .from_json() 方法的反序列化场景 |
msgpack + dataclass | import 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
- PythonPython 官方文档 - dataclasses
- PythonPython 官方文档 - typing 模块
- PythonPEP 557 - Data Classes
- PydanticPydantic 官方文档 - Models
- FastAPIFastAPI 官方文档 - 请求体
- PythonPython 官方文档 - typing 模块
- attrsattrs 官方文档
- PythonPEP 484 - Type Hints
- JSON 压缩
- CSV 转 JSON
- JSON 转 CSV
- JSON Diff
- JSON Escape / Unescape
- JSON扁平化
- JSON 格式化
- JSON 生成器
- JSONPath 查询
- JSON 合并
- JSON 修复
- JSON Schema 校验
- JSON 排序
- JSON Stringify
- JSON 转 HTML
- JSON 转 Java
- JSON 转 Markdown
- JSON 转 SQL
- JSON 转 TOML
- JSON 转 TypeScript
- XML 转 JSON
- JSON 转 XML
- YAML 转 JSON
- JSON 转 YAML
- JSON 转 Python
- JSON 转 Go
- JSON 转 Rust
- JSON 转 Swift
- JSON 转 C#
- JSON 转 C++
- JSON 转 PHP