API 响应字段对齐
后端返回的 JSON 里有一个嵌套的 'address' 对象,前端 TypeScript 项目要求用 TypedDict 定义类型。手动逐层写类型定义容易漏掉可选字段 'apt',导致编译报错。用本工具把 JSON 粘贴进去,选择输出 TypedDict 格式,自动生成带 'NotRequired' 标记的类型定义,直接复制进 .pyi 文件,省去逐字段对文档的排查时间。
开发者工具 · JSON / 数据格式
TypedDict/pydantic
Python 类型将在这里呈现 —— 点「示例」试试将 JSON 的嵌套结构手动翻译成 Python 类型注解,是 API 对接中最容易出错的环节——漏一个 Optional、写错一个字段名,代码就可能在运行时静默崩溃。这个工具把 JSON 样本直接转换成 TypedDict 或 pydantic 模型定义,自动处理嵌套对象、数组和可选字段。转换在浏览器内完成,JSON 内容不会离开本地,适合处理包含敏感字段的接口文档。
后端返回的 JSON 里有一个嵌套的 'address' 对象,前端 TypeScript 项目要求用 TypedDict 定义类型。手动逐层写类型定义容易漏掉可选字段 'apt',导致编译报错。用本工具把 JSON 粘贴进去,选择输出 TypedDict 格式,自动生成带 'NotRequired' 标记的类型定义,直接复制进 .pyi 文件,省去逐字段对文档的排查时间。
旧项目迁移到 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 分钟。
| 输入 | 输出 | 说明 |
|---|---|---|
| {"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 标准不支持注释,/* */ 或 // 都会导致解析错误,应移除所有注释。
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 到输入框,点击转换后,在结果区的「类型定义」标签页里就能看到生成的 TypedDict 代码。工具会自动把 JSON 的嵌套结构映射成 TypedDict 的嵌套类,字段名保持原样,类型会推断为 str、int、list、Optional 等。如果 JSON 里某个字段有时有值有时 null,类型会变成 Optional[类型];如果字段名在 Python 里是关键字(比如 class),工具会自动加下划线后缀。
这是根据 JSON 里的实际数据推断的。如果 JSON 里某个字段在所有记录里都出现了且值不是 null,工具就认为它是必填字段,类型不加 Optional。只要有一条记录里该字段缺失或值为 null,类型就会变成 Optional[类型],并且字段定义会加上 default=None。如果 JSON 里有多条记录,工具会合并所有记录的字段出现情况来做判断,所以输入的数据越有代表性越好。
工具目前是按 JSON 实际值的类型自动推导 Python 类型,不支持在界面上手动覆盖单个字段的类型。如果数字 123 在 JSON 里就是数字,转出来就是 int 或 float。如果确实需要转成 str,可以在生成的代码里手动把字段类型注解改成 str,然后把赋值部分做 str(...) 转换。或者,在 JSON 里就把那个值写成带引号的字符串,工具会跟着推断为 str。
嵌套深意味着工具会为每一层 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 代码里用带下划线的名字。
空数组 [] 因为没有元素,工具无法推断列表里元素的类型,所以会转成 List[Any] 或 list(取决于输出格式)。如果 JSON 里既有空数组又有非空数组(比如 [1, 2, 3] 和 [] 都出现在同一个字段的不同记录里),工具会优先用非空数组的元素类型来推导,空数组会被视为该类型的空列表。如果所有数组都是空的,就只能用 Any 了。建议这种情况在生成的代码里手动把 Any 替换成实际的元素类型。
全程在浏览器本地处理。JSON 数据不会离开当前页面,也不会被上传到任何服务器。实现方式是纯前端 JavaScript 解析 JSON,然后在内存中生成 Python 代码字符串,整个过程没有网络请求。所以即便处理包含敏感信息(如 API 密钥、用户数据、配置密码)的 JSON,也不会有泄露风险。关闭页面或刷新后,输入的数据和结果都会清空。
可以,但受浏览器内存限制。工具没有硬编码的行数或大小上限,实际瓶颈是浏览器分配给当前标签页的内存(通常几百 MB 到 1GB 左右)。几万行的普通 JSON(比如日志列表、配置数组)通常没问题。但如果 JSON 里包含大量 Base64 编码的图片或超大文本字段,内存占用会急剧上升,可能导致页面卡顿或崩溃。建议先试一小段数据确认结构正确,再处理完整文件。如果浏览器标签页崩溃,可以分段处理。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。