如何解决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
相关产品推荐
相关产品推荐

