JSON 转 Python · 免费在线生成 Python 类
免费在线 JSON 转 Python 工具,粘贴 JSON 一键生成带 @dataclass 装饰器的 Python 类,字段带完整类型标注(str/int/float/bool/List/Any)。与 Java、Go 不同,Python 的 dataclass 本身不做键名映射,所以生成结果适合作为类型骨架,再按需改造成 pydantic 模型或补 field 默认值。纯浏览器本地生成,不上传、免登录。
- 粘贴接口返回的 JSON(本页已自动预选 Python)。
- 填写根类名,默认 Root。
- 复制生成的 dataclass 代码。
- 补上 dataclass 与 typing 的 import,按需调整字段顺序与默认值。
需要补哪些 import?
至少要 from dataclasses import dataclass;数组字段用到 List、null 字段用到 Any 时还需要 from typing import List, Any。Python 3.9 起也可以直接用内置的 list[str] 写法替换 List[str],省掉 typing 导入。
为什么报 NameError: name Address is not defined?
因为根类排在前面,而它引用的嵌套类定义在后面,类型标注在类体执行时就会求值。三种解法:在文件首行加 from __future__ import annotations(推荐,注解全部延迟求值);把注解写成字符串 "Address";或者把嵌套类的定义挪到根类之前。
字段名保持了 JSON 的写法吗?
字段名会按驼峰生成(user_name 变成 userName),这与 PEP 8 推荐的蛇形命名不一致。如果要遵循 PEP 8,需要手工改成 user_name,并在反序列化时做键名映射——dataclass 没有内置的别名机制,这一步用 pydantic 的 alias 或自定义 from_dict 更方便。
怎么从 dict 构造出实例?
字段名与 JSON 键一致时可以 Root(**data) 快速构造,但嵌套对象不会自动递归成子类实例,仍是 dict。需要完整递归解析建议换 pydantic 的 BaseModel 或 dacite 库,把生成的 dataclass 直接交给它们即可。
可选字段怎么表达?
推断结果都是必填字段。可选字段建议改成 Optional[str] = None,注意 dataclass 要求带默认值的字段排在无默认值字段之后,否则会报 TypeError。null 值字段目前推断为 Any,也应按实际类型改成 Optional。