You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决Dart中json_serializable继承类的JSON序列化字段缺失问题?

Dart json_serializable 继承序列化问题解决方案

问题回顾

子类AddLeadModel继承BaseLeadModel后,执行flutter pub run build_runner build生成的序列化代码未包含父类字段,导致父类属性无法正常序列化/反序列化,且不想手动重复父类所有参数。


1. 如何自动将继承字段纳入生成的JSON序列化代码?

可以实现自动纳入,无需手动重复父类参数,只需调整代码结构:

步骤1:优化子类构造函数(Dart 2.17+ 推荐)

利用Dart的super命名参数语法,直接继承父类的所有参数,父类新增字段时子类无需修改:

@JsonSerializable()
class AddLeadModel extends BaseLeadModel {
  final String? leadStatusId;
  final CreateLeadEnquiryModel? enquiry;

  AddLeadModel({
    super.name,
    super.email,
    super.contactNo,
    this.leadStatusId,
    this.enquiry,
  });

  factory AddLeadModel.fromJson(Map<String, dynamic> json) => _$AddLeadModelFromJson(json);
  
  @override
  Map<String, dynamic> toJson() => _$AddLeadModelToJson(this);
}

步骤2:重新生成序列化代码

执行命令:

flutter pub run build_runner build

生成的代码会自动调用父类的fromJson和toJson方法,包含所有父类字段的序列化逻辑。

若使用Dart 2.17以下版本,可通过显式传递父类参数实现(需手动列出父类参数,但生成代码仍会自动处理序列化):

AddLeadModel({
  String? name,
  String? email,
  String? contactNo,
  this.leadStatusId,
  this.enquiry,
}) : super(name: name, email: email, contactNo: contactNo);

2. 手动实现fromJson/toJson时如何利用继承特性?

若需手动实现,可复用父类的序列化逻辑,避免重复代码:

手动实现fromJson

factory AddLeadModel.fromJson(Map<String, dynamic> json) {
  // 先解析父类字段
  final baseModel = BaseLeadModel.fromJson(json);
  // 再解析子类专属字段
  return AddLeadModel(
    name: baseModel.name,
    email: baseModel.email,
    contactNo: baseModel.contactNo,
    leadStatusId: json['leadStatusId'],
    enquiry: json['enquiry'] != null ? CreateLeadEnquiryModel.fromJson(json['enquiry']) : null,
  );
}

手动实现toJson

@override
Map<String, dynamic> toJson() {
  // 先获取父类的序列化结果,再添加子类字段
  final baseJson = super.toJson();
  baseJson.addAll({
    'leadStatusId': leadStatusId,
    'enquiry': enquiry?.toJson(),
  });
  return baseJson;
}

这种方式无需依赖代码生成工具,但父类新增字段时需同步修改手动代码,维护成本较高。


内容的提问来源于stack exchange,提问作者Sachin Chavan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:53:13