Skip to main content
CheckTown
转换工具

如何将 JSON 转换为 Dart 模型类

发布于 阅读约 5 分钟
本文目录

为什么 Dart/Flutter 开发者需要生成 JSON 类

Flutter 应用高度依赖 JSON 进行 API 通信,但 Dart 并不像其他语言中的 Gson 或 Jackson 那样内置 JSON 到对象的映射能力。每一个 API 响应都需要一个模型类,并手动编写 fromJson 和 toJson 工厂方法。对于要对接多个接口的应用来说,这类样板代码会迅速成倍增加——我们的转换器可以根据 JSON 样本即时生成完整的 Dart 模型类,为你省下数小时的重复编码。

自 Dart 2.12 引入健全的空安全(sound null safety)以来,模型类中的每个字段都必须显式声明为可空或非空。转换器会分析你的 JSON 数据,为每个字段判断正确的可空性,从一开始就生成能够正确配合 Dart 空安全体系工作的模型。

fromJson/toJson 模式

转换器生成的 Dart 类遵循整个 Flutter 生态中通用的工厂构造函数模式。

  • factory fromJson——生成一个接收 Map<String, dynamic> 的工厂构造函数,通过恰当的类型转换、空值检查和嵌套对象解析来初始化所有字段
  • toJson 方法——创建一个返回 Map<String, dynamic> 的 toJson() 方法用于序列化,并通过递归调用嵌套对象的 toJson() 方法来处理它们
  • 嵌套模型生成——当 JSON 包含嵌套对象时,转换器会为每个嵌套结构创建独立的 Dart 类,各自带有 fromJson/toJson 方法,并从父类正确关联引用

免费试用 —— 无需注册

将 JSON 转换为 Dart →

空安全与 json_serializable 集成

转换器生成的空安全 Dart 代码与现代 Flutter 开发实践完全兼容。

  • 健全空安全——JSON 样本中值为 null 的字段会被声明为可空类型(String?),而有值的字段则使用非空类型(String),并在 fromJson 构造函数中加入相应的空值检查
  • json_serializable 兼容——生成的类结构与 json_serializable 包兼容,你可以添加 @JsonSerializable() 和 @JsonKey 注解,配合 build_runner 进行代码生成
  • 列表处理——对象数组会生成 List<ChildModel> 类型,并在 fromJson 中通过 .map() 和 .toList() 正确映射,同时处理可空与非空列表两种情形

常见问题

我应该改用 freezed 包吗?

freezed 包为 Dart 类添加了不可变性、联合类型和模式匹配支持,但它需要配置 build_runner,并增加了编译期的复杂度。我们的转换器生成的是不依赖任何代码生成工具的普通 Dart 类。你之后仍可以通过添加注解将输出迁移到 freezed——字段名和类型保持不变。

转换器如何处理嵌套的 JSON 模型?

每个嵌套的 JSON 对象都会变成一个独立的 Dart 类,各自带有 fromJson 工厂方法和 toJson 方法。父类在其类型声明中引用子类,并在工厂构造函数中调用 ChildModel.fromJson()。深层嵌套的结构也能得到完整支持,并具备正确的类型层次。

生成的代码中如何处理 List 字段?

基本类型的列表会生成简单的类型化列表(List<String>、List<int>)。对象列表会生成 List<ChildModel>,并使用 fromJson 映射:(json['items'] as List).map((e) => ChildModel.fromJson(e)).toList()。可空列表包含空值检查,空数组则生成正确类型的空列表默认值。

相关工具