JSON 转 Dart 工具

步 1 / 333%

根据一个 JSON 对象或一组对象示例,生成无需第三方依赖的 Dart 模型类。转换器会合并所有示例项、创建嵌套类、保留原始 JSON 键,并生成可靠的空安全字段类型及 fromJson 工厂构造函数。如需与 jsonEncode 兼容的输出,还可添加 toJson 方法。示例和生成的代码只保留在当前浏览器中,不会上传或写入 URL。

工作原理

  1. 1

    粘贴有代表性的示例

    使用一个 JSON 对象或对象数组。提供多个元素有助于识别缺失字段、可空字段和混合类型字段。

  2. 2

    选择 Dart 选项

    设置根类名称,选择是否让所有字段可空,并根据需要添加 toJson 方法。

  3. 3

    检查并导出

    检查推断出的类,然后复制代码或将 models.dart 文件下载到本地。

JSON 如何变为空安全的 Dart 模型

Dart 官方的dart:convert 文档说明,jsonDecode() 会生成与 JSON 兼容的值,例如数字、字符串、布尔值、null、列表以及以字符串为键的映射。模型类不能直接编码为 JSON,但 jsonEncode() 可以调用类的 toJson() 方法。本转换器无需添加 json_serializable 注解或第三方包,即可生成这种手动序列化代码。

假设示例中有一个包含嵌套地址的用户。生成的 User 会包含 final 字段和使用命名参数的构造函数。User.fromJson(Map<String, Object?> json) 会转换标量值,并对嵌套对象调用 UserAddress.fromJson()。如果任一示例对象缺少 address 或其值为 null,该字段的类型会变为 UserAddress?,工厂构造函数会先检查 null,再创建对象。启用 toJson 后,嵌套模型会递归转换为 jsonEncode() 可接受的映射。

JSON 中观察到的值 生成的 Dart 类型
整数 int
小数 double
同时有整数和小数示例 num
文本 String
布尔值 bool
嵌套对象 生成的模型类
类型一致的数组 List<T>
空的或类型不兼容的嵌套数组 List<Object?>
只有 null 或值类型冲突 Object?

转换器会检查根数组中的每个对象,而不是只依据第一个元素。如果某个字段在任一元素中缺失或明确为 null,该字段就会成为可空类型。如果实际 API 比示例更不稳定,也可以选择让所有字段都可空。Dart 空安全指南指出,类型默认不可为 null,需要添加 ? 才能接受 null。

标识符处理和推断限制

JSON 键不必是有效的 Dart 成员名称。工具会移除标点,将单词转换为 lowerCamelCase,为保留字添加安全后缀,并在名称冲突时添加稳定的数字后缀。原始键在 json['original-key']toJson() 映射中保持不变。嵌套类名使用完整路径,因此互不相关的地址对象不会在不知情的情况下合并为同一个类。

单个示例无法证明完整的 API 约定。JSON 字符串不会自动识别为日期、UUID 或 enum,空数组也无法提供元素类型。对象成员名称重复时也不能保证往返转换安全,因为 JSON 解析器通常只保留最后一个值。投入生产环境前,请根据 API 文档或 schema 检查生成的模型。工具会限制输入大小、嵌套深度、推断出的声明数量和输出大小,使浏览器处理量保持在可控范围内。

常见问题

不会。解析、推断、代码生成、复制和下载都在浏览器中完成。JSON 和生成的 Dart 代码不会发送到我们的服务器,也不会写入 URL。

可以。Flutter 使用 Dart,因此这些无需第三方依赖的类可以用于 Flutter 项目。请先根据实际 API 约定检查推断出的类型。

不会。工具会生成手动 fromJson 和可选的 toJson 方法,不依赖任何第三方包或 build_runner。

观察到值为 null 或缺失的字段会成为可空类型。如果示例不能充分代表实际数据,也可以选择让所有生成的字段都可空。

不能。结果只反映已经观察到的值。请使用多个对象示例,并将结果与提供方的 schema 或文档进行比较。

相关工具

此工具还提供其他语言版本