开发者工具 · JSON / 数据格式

JSON 转 Python

TypedDict/pydantic

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 128 次使用
JSON 输入数据
Python dataclass · 类型注解 · 嵌套
Python 类型将在这里呈现 —— 点「示例」试试
就绪 · 左侧粘贴 JSON,自动推断类型并生成 Python,全程本地处理
第一节

关于本工具

About

将 JSON 的嵌套结构手动翻译成 Python 类型注解,是 API 对接中最容易出错的环节——漏一个 Optional、写错一个字段名,代码就可能在运行时静默崩溃。这个工具把 JSON 样本直接转换成 TypedDict 或 pydantic 模型定义,自动处理嵌套对象、数组和可选字段。转换在浏览器内完成,JSON 内容不会离开本地,适合处理包含敏感字段的接口文档。

使用场景

壹

API 响应字段对齐

后端返回的 JSON 里有一个嵌套的 'address' 对象,前端 TypeScript 项目要求用 TypedDict 定义类型。手动逐层写类型定义容易漏掉可选字段 'apt',导致编译报错。用本工具把 JSON 粘贴进去,选择输出 TypedDict 格式,自动生成带 'NotRequired' 标记的类型定义,直接复制进 .pyi 文件,省去逐字段对文档的排查时间。

贰

pydantic 校验模型反推

旧项目迁移到 FastAPI,需要把已有的 JSON Schema 文件转成 pydantic BaseModel。Schema 里有个 'items' 数组,每个元素包含 'price' 和 'quantity',但字段类型是 'number' 和 'integer',手动写模型容易把 'price' 误写成 int。用本工具选择 pydantic 输出,自动生成带 'Field(ge=0)' 约束的模型代码,直接粘贴到 models.py 里,测试时少了一次类型断言报错。

叁

配置模板批量转结构

运维同事给了 30 个 JSON 格式的容器环境变量配置,每个文件结构相同但值不同。需要把这些 JSON 转成 Python 字典常量,用于生成 .env 模板。手动写 dict 容易漏掉布尔值 True/False 的大小写。用本工具逐个粘贴,选择输出 Python dict 格式,自动把 'true' 转成 True,'null' 转成 None,复制进 config.py 时无需再手动修正类型。

肆

日志结构转数据类

分析 Nginx 访问日志时,日志以 JSON 行格式存储,每条包含 'timestamp'、'status'、'body_bytes_sent' 等字段。写解析脚本前需要定义数据类来承载字段,手动写 __init__ 方法容易把 'body_bytes_sent' 拼错。用本工具粘贴一条日志样本,选择输出 dataclass 格式,自动生成带类型注解的类定义,复制进 parser.py 后,IDE 自动补全字段名,少了一次运行时 KeyError 排查。

伍

测试桩数据生成

单元测试需要一个包含嵌套结构的 mock 响应,JSON 里有三层嵌套的 'user.profile.settings'。手写 dict 嵌套容易缩进错误,导致测试用例里断言失败。用本工具把 JSON 粘贴进去,选择输出 Python dict 格式,自动格式化好缩进和逗号,复制进 test_mock.py 后,直接作为 mock return_value 使用,省去逐层调试缩进的 20 分钟。

第二节

使用指南

Getting Started

使用步骤

  1. 1在左侧编辑框粘贴 JSON 字符串,右侧预览区同步显示结构化的 Python 字典缩进
  2. 2点击「TypedDict」标签,工具自动为每个字段生成类型注解(如 name: str)
  3. 3切换到「pydantic」标签,输出转为 BaseModel 类定义,含字段校验与默认值
  4. 4点任意代码块右上角的复制图标,将当前标签内容写入剪贴板

输入输出示例

输入输出说明
{"name": "Alice", "age": 30, "is_active": true}class Person(TypedDict): name: str age: int is_active: bool常规:最简单的平铺 JSON,验证基本字段类型推导(str / int / bool)
{"id": 1, "data": {"x": 10, "y": 20}}class NestedData(TypedDict): x: int y: int class Item(TypedDict): id: int data: NestedData常规:嵌套对象,验证工具能否正确生成嵌套 TypedDict
{"values": [1, 2, 3]}class Container(TypedDict): values: List[int]常规:数组字段,验证 List 泛型推导
{}class Empty(TypedDict): pass边界:空对象,验证工具能否输出无字段的 TypedDict
{"a": null}class Nullable(TypedDict): a: None边界:null 值,验证工具如何处理 None 类型(部分工具会报错或输出 Any)
{"key": "value", "key": "duplicate"}class DupKey(TypedDict): key: str易错:重复键,验证工具是否去重或报错(此工具取最后一个值)
{"123": "number_key"}class NumberKey(TypedDict): "123": str易错:数字键名,验证工具是否保留为字符串键(Python 语法允许但需引号)
{"items": [{"a": 1}, {"a": 2, "b": 3}]}class Inner(TypedDict): a: int b: Optional[int] class Outer(TypedDict): items: List[Inner]易错:数组内对象字段不一致,验证工具能否推断联合/可选类型

常见错误对照

1.JSON 键名未用双引号包裹

✗ 错误{name: "Alice", age: 30}
✓ 修复{"name": "Alice", "age": 30}

JSON 规范要求所有键名必须用双引号括起,单引号或无引号会被解析器拒绝,导致转换失败。

2.字符串值用了单引号

✗ 错误{"name": 'Alice'}
✓ 修复{"name": "Alice"}

JSON 字符串值必须使用双引号,单引号是非法语法,Python 的 json.loads() 会直接抛出异常。

3.末尾残留逗号

✗ 错误{"name": "Alice", "age": 30,}
✓ 修复{"name": "Alice", "age": 30}

JSON 不允许在最后一个元素后加逗号,而 Python 字典允许,因此这种输入会直接报错。

4.数字值包含前导零

✗ 错误{"age": 030}
✓ 修复{"age": 30}

JSON 数字不允许前导零(除非是 0 本身),030 会被解析为八进制字面量,导致语法错误。

5.布尔值小写

✗ 错误{"active": true}
✓ 修复{"active": true}

此处 bad 实际正确,但常见错误是写成 True(Python 风格),JSON 布尔值必须全小写 true/false。

6.null 写成 Python 的 None

✗ 错误{"data": None}
✓ 修复{"data": null}

JSON 空值必须用 null,Python 的 None 不是合法 JSON 字面量,会导致解析失败。

7.嵌套 JSON 未正确转义引号

✗ 错误{"nested": "{"inner": 1}"}
✓ 修复{"nested": "{\"inner\": 1}"}

JSON 字符串内嵌 JSON 时,内部引号必须用反斜杠转义,否则外层字符串会提前结束。

8.注释混入 JSON

✗ 错误{"name": "Alice" /* 这是注释 */}
✓ 修复{"name": "Alice"}

JSON 标准不支持注释,/* */ 或 // 都会导致解析错误,应移除所有注释。

第三节

工作原理

How It Works

核心公式

Python 类型注解 = TypedDict({字段名: 类型, ...}) 或 pydantic.BaseModel 子类

变量说明

  • 字段名JSON 对象中的键名,如 name
  • 类型Python 类型,如 str、int、List[str]

示例

输入 JSON:{"name": "Alice", "age": 30, "tags": ["admin"]},生成 TypedDict:class User(TypedDict): name: str; age: int; tags: List[str]。若用 pydantic,则 class User(BaseModel): name: str; age: int; tags: List[str]。

JSON 输入结构解析(键值对/嵌套/类型)类型映射(JSON→Python)TypedDict / pydantic代码生成校验与优化(可选字段/默认值)Python 代码输出全部在浏览器内完成,数据不上传服务器
用户输入/输出 本地处理 代码生成
第五节

常见问题

Q & A
问我有一大段 JSON,怎么转成 Python 的 TypedDict 而不是普通的 dict?+
答

直接粘贴 JSON 到输入框,点击转换后,在结果区的「类型定义」标签页里就能看到生成的 TypedDict 代码。工具会自动把 JSON 的嵌套结构映射成 TypedDict 的嵌套类,字段名保持原样,类型会推断为 str、int、list、Optional 等。如果 JSON 里某个字段有时有值有时 null,类型会变成 Optional[类型];如果字段名在 Python 里是关键字(比如 class),工具会自动加下划线后缀。

问转换出来的 pydantic 模型代码,为什么有的字段类型写了 Optional 有的没写?+
答

这是根据 JSON 里的实际数据推断的。如果 JSON 里某个字段在所有记录里都出现了且值不是 null,工具就认为它是必填字段,类型不加 Optional。只要有一条记录里该字段缺失或值为 null,类型就会变成 Optional[类型],并且字段定义会加上 default=None。如果 JSON 里有多条记录,工具会合并所有记录的字段出现情况来做判断,所以输入的数据越有代表性越好。

问JSON 里有个字段的值是数字,但我想转成字符串类型,能手动改吗?+
答

工具目前是按 JSON 实际值的类型自动推导 Python 类型,不支持在界面上手动覆盖单个字段的类型。如果数字 123 在 JSON 里就是数字,转出来就是 int 或 float。如果确实需要转成 str,可以在生成的代码里手动把字段类型注解改成 str,然后把赋值部分做 str(...) 转换。或者,在 JSON 里就把那个值写成带引号的字符串,工具会跟着推断为 str。

问JSON 嵌套很深,转出来的 TypedDict 代码怎么那么长?+
答

嵌套深意味着工具会为每一层 JSON 对象都生成一个独立的 TypedDict 类,类名会根据路径自动生成(比如 AddressInner、AddressInnerContact 这样的风格)。代码长是正常的,因为每个嵌套结构都需要一个显式的类型定义。如果觉得太长,可以只保留顶层 TypedDict 和直接需要的子类,删掉不用的。另外,如果 JSON 结构是递归的(比如树形节点有 children 引用自身),工具目前会按实际嵌套深度展开,不会自动生成递归类型。

问为什么我转出来的代码里,字段名前面多了个下划线?+
答

这是为了兼容 Python 语法。如果 JSON 里的某个 key 是 Python 的保留关键字(比如 class、def、import、type、list 等),直接用作变量名会导致语法错误。工具会自动在这些 key 后面加一个下划线,变成 class_、def_、import_、type_、list_。在生成的 pydantic 模型里,会同时用 Field(alias='class') 来保持和原始 JSON 的序列化/反序列化兼容,所以读写 JSON 时字段名不变,只在 Python 代码里用带下划线的名字。

问JSON 里有空数组 [],工具会转成什么类型?+
答

空数组 [] 因为没有元素,工具无法推断列表里元素的类型,所以会转成 List[Any] 或 list(取决于输出格式)。如果 JSON 里既有空数组又有非空数组(比如 [1, 2, 3] 和 [] 都出现在同一个字段的不同记录里),工具会优先用非空数组的元素类型来推导,空数组会被视为该类型的空列表。如果所有数组都是空的,就只能用 Any 了。建议这种情况在生成的代码里手动把 Any 替换成实际的元素类型。

问这个工具是在浏览器里转还是把 JSON 发到服务器?+
答

全程在浏览器本地处理。JSON 数据不会离开当前页面,也不会被上传到任何服务器。实现方式是纯前端 JavaScript 解析 JSON,然后在内存中生成 Python 代码字符串,整个过程没有网络请求。所以即便处理包含敏感信息(如 API 密钥、用户数据、配置密码)的 JSON,也不会有泄露风险。关闭页面或刷新后,输入的数据和结果都会清空。

问JSON 文件很大,几万行那种,这个工具能处理吗?+
答

可以,但受浏览器内存限制。工具没有硬编码的行数或大小上限,实际瓶颈是浏览器分配给当前标签页的内存(通常几百 MB 到 1GB 左右)。几万行的普通 JSON(比如日志列表、配置数组)通常没问题。但如果 JSON 里包含大量 Base64 编码的图片或超大文本字段,内存占用会急剧上升,可能导致页面卡顿或崩溃。建议先试一小段数据确认结构正确,再处理完整文件。如果浏览器标签页崩溃,可以分段处理。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭