类型生成

JSON 转 Python生成 dataclass 与 Pydantic 模型

比较示例中的两条记录:缺少键与明确的 null 会生成不同的字段默认值。

JSON 转 Python

JSON 输入

解析与生成均在当前浏览器内完成,输入不会上传或存储。

生成的源码

生成选项

支持 Python 3.9+。dataclass 元数据不解码或校验。Pydantic 2.12.5 提供 load_models(source),请用它落实所选数字策略。

数组样本定义元素模型 Root。Pydantic 的 load_models 接受对象或数组。

2 个类 · 2 个可空字段

JSON 转 Python 把有代表性的接口响应整理成模型草稿。请提供键名有所差异的多条记录;只提供一个完整对象,无法推断哪些字段可能缺失。

Python 类型注解描述观测到的结构。选择标准库数据类保存数据,或用 Pydantic 模型解析和校验;样本不会自动形成完整的业务约束。

为什么用 JSON 转 Python?

明确区分缺失与空值

JSON 转 Python 会让始终存在、但可为空的字段保持必填;若其他样本缺少这个键,则添加 None 默认值。两者对构造函数和校验的要求不同。

两张对象卡片中的空值标记与缺失槽位分别连向不同的字段默认值。

重命名后仍能找到原始键

保留字、标点与模型方法名需要安全的 Python 属性名。生成器用 dataclass 元数据或 Pydantic 别名记录原始拼写,冲突时按确定规则添加后缀。

不规则的键形状经元数据与校验别名两条路径连接到安全的字段槽位。

先确定如何读取模型

01

提供有差异的记录

输入单个对象或非空对象数组。嵌套数组同一位置的所有对象共同参与元素模型推断,跨样本比较才能发现缺失字段。

02

检查选项的实际含义

默认仅为观测到缺失的键添加 None;全可选模式允许每个字段省略。日期默认保留 str。Decimal 影响小数、指数数字及包含它们的合并数字组。

03

导出前等待新结果

编辑后等待 350 毫秒自动生成。关闭自动模式后使用生成按钮或 Ctrl/Cmd+Enter。任何修改都会立即禁用导出;清空和示例操作保留一次输入、选项与源码的撤销快照。

源码包含哪些行为

两种模型在一个文件中生成

JSON 转 Python dataclass 输出只依赖标准库,把必填字段排在有默认值的字段前。Pydantic 固定兼容 2.12.5。子类先于引用它的父类声明,整个文件可在 Python 3.9 导入。

明确整数与小数策略

纯整数组使用任意精度 int;出现小数或指数形式时,默认整组使用 float,混入的大整数也可能发生二进制舍入。Decimal 模式为这类组使用 Decimal;配套加载函数无需经过 float 中间值,也会精确解析 Any 容器中的小数。

谨慎推断日期

ISO 模式仅识别有效日历日期,以及带时区且小数秒不超过六位的完整时间戳。同一位置的所有非空字符串必须属于同一种日期类型。无时区、无效或更高精度时间仍为 str;只有 Pydantic 会转换字符串。

保留不规则键的对应关系

字段转为 ASCII snake_case。关键字、前导下划线、model_* 名称与 BaseModel 方法名会重命名。空键、Unicode 和控制字符保留别名;导入模块使用私有别名,避免与 Decimal 等类名冲突。

生成代码的边界

数据类不会自动读取嵌套对象
类型注解与 json_key 元数据不校验输入、不映射键名、不构造嵌套实例,也不解析日期。必须自行创建 dataclass;直接传入嵌套 dict,内部仍然是 dict。asdict 使用属性名,不读取别名元数据。
用配套函数读取 Pydantic 模型
安装 pydantic==2.12.5 后调用 load_models(source)。它先用所选 float/Decimal 策略执行 json.loads,再调用 model_validate,返回实例或实例列表。直接调用 model_validate_json 不具备此辅助函数的 Decimal 保真保证;Decimal 序列化通常得到 JSON 字符串。
可空不等于可省略
Pydantic 只接受原始 JSON 别名,并以 extra="forbid" 拒绝未知属性。Optional[T] 允许 null,默认值才允许省略。缺失值默认是 None,仅看值无法区分缺失和 null,可检查 model_fields_set。普通类型转换也不等于严格业务校验。
样本不足时保持宽泛
类型冲突或仅见 null 的字段用 Any,空数组用 List[Any],空嵌套对象用 Dict[str, Any]。不生成枚举、UUID、EmailStr、TypedDict、JSON Schema、OpenAPI 或 ORM;根标量、空根数组和混合根数组会被拒绝。
映射和数值范围会报错
关闭别名后,需要重命名的键一律报错。两种框架均拒绝未配对的 Unicode 代理字符键。float 拒绝溢出与非零小数下溢为零,但不保证十进制精度;精确金额或科学小数应选 Decimal。
严格语法与明确预算
不支持注释、尾逗号、重复键、自动修复、文件导入、URL 获取或执行 Python。限制为输入 500,000 字符、50,000 节点、深度 40、每个合并对象 100 字段、200 类、每个键或数字 1,000 字符、指数绝对值 10,000,以及输出 1,000,000 字符。

JSON 转 Python 常见问题

不用第三方库,能把 JSON 解析成 dataclass 吗?

可以自行编写转换代码而不安装第三方库,但生成的数据类不带解码器。json.loads 得到字典与列表,您还需要映射别名并逐层构造实例。

嵌套对象为什么仍是 dict?

JSON 转 Python 生成的 dataclass 只声明字段。构造函数不会根据注解把 dict 变为子类;可自行转换,或选择 Pydantic 并调用 load_models 完成嵌套构造。

原始 JSON 键名和 Python 属性名不同怎么办?

启用别名后,Pydantic 的 Field(alias=...) 接受原键名;dataclass 把它存为 json_key 元数据,供您的适配器读取。冲突键通过后缀分开,不会落到其他字段的 Python 属性名。

JSON 新增字段后,已有类会自动更新吗?

不会。导出的类是静态源码,只有重新生成或手动修改才会更新。新增键传给当前 Pydantic 模型会触发未知字段错误;请用有代表性的新样本重新生成并评审变更。

dataclass 实例怎样再转回 JSON?

可以先用 dataclasses.asdict 递归得到字典,再由 json.dumps 序列化,但键会是 Python 属性名。原始别名需要自己还原,date 与 Decimal 等值还需要专门的编码策略。

发现需要改进的推断情况?

用真实记录检查模型

用 JSON 转 Python 比较缺失键、空值与典型数字,再在应用中验证导出代码的读取行为。