如何在Dart中使用json_serialized实现带有继承的JSON序列化?

问题描述 投票:0回答:1

我正在使用 Dart 和 json_serialized 包来管理我的模型的 JSON 序列化,并且遇到了有关继承的问题。

我有以下基本模型:

@JsonSerializable()
class BaseLeadModel {
  final String? name;
  final String? email;
  final String? contactNo;

  BaseLeadModel({this.name, this.email, this.contactNo});

  factory BaseLeadModel.fromJson(Map<String, dynamic> json) => _$BaseLeadModelFromJson(json);

  Map<String, dynamic> toJson() => _$BaseLeadModelToJson(this);
}

我有一个扩展 BaseLeadModel 的派生模型:

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

  AddLeadModel({
    this.leadStatusId,
    this.enquiry,
  }) : super();

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

问题:

当我使用 flutter pub run build_runner build 生成序列化代码时,为 AddLeadModel 生成的 fromJson 和 toJson 方法不包含 BaseLeadModel 中的字段。这会导致基类字段未正确序列化或反序列化的问题。

如何确保 BaseLeadModel 中的字段包含在 AddLeadModel 类的序列化和反序列化过程中?

  1. 有没有办法在生成的 JSON 序列化代码中自动包含继承字段?
  2. 如果我必须手动实现 fromJson 和 toJson 方法,我怎样才能做到这一点,同时仍然有效地利用继承?

我尝试过以下方法

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

但是我的基础模型可能有更多的属性,我不想再次重复并在我的基础模型中添加相同的属性。

json flutter inheritance serialization jsonserializer
1个回答
0
投票

虽然你可以写

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

你可以通过写这个来缩短它

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

据我所知,没有办法省略 super 的参数。

© www.soinside.com 2019 - 2024. All rights reserved.