Dart/flutter 泛型 处理fromjson

前言:泛型可以减少很多冗余代码,规范且易维护。

需求概述:app调用接口时,统一接收类。

需求分析:如果你使用了json_serializable插件, 可参考 https://blog.csdn.net/K_Hello/article/details/115525018。

本人没有使用json_serializable,实体类的json解析都是实体在创建时自动生成的,也尝试了用json_serializable,但是一直出现错误,不是版本问题就是环境问题,一直无法解决那些问题,所以干脆放弃json插件,反正需求不大。

但是当不使用json_serializable时,如果实现泛型中的json序列化呢?核心问题就在于实体的实例化与json的序列化。Dart语言深拷贝是需要实例化实体的,而泛型恰恰无法实例化实体,只能借助于抽样类。

我的解决思路:

A.创建实体抽象类(类名:BaseTData),要求实现fromJson

B.修改实体类(类名:DysupFormTempEntity),继承BaseTData,实现fromJson

C.创建泛型接口类(类名:TData),泛型约束为BaseTData

 

具体代码:

api返回的json格式:

{
	"Total": 3,
	"Data": [{
			"Id": "603545762638336000",
			"FormName": "4楼配电室日常检查",
			"DeptName": "4001"
		},
		{
			"Id": "603874114238681088",
			"FormName": "4楼配电室消毒检查",
			"DeptName": "4001"
		},
		{
			"Id": "603545827813625856",
			"FormName": "4楼更衣室日常检查",
			"DeptName": "4002"
		}
	],
	"Tag": 1,
	"Message": "",
	"Description": ""
}

抽象类 BaseTData

abstract class BaseTData {
  dynamic newIns();
  fromJson(Map<String, dynamic> json);
}

实体类 DysupFormTempEntity

class DysupFormTempEntity extends BaseTData {
  ///pkid
  String? id;

  ///动态监督被查科室表pkid
  String? dysupDeptId;

  ///动态监督类型
  String? dysupType;

  ///表单名称
  String? formName;

  ///被查科室
  String? deptName;

  ///监督人员数量
  int? personNum;

  ///表单项目数量
  int? detailNum;

  DysupFormTempEntity(
      {this.id,
      this.dysupDeptId,
      this.dysupType,
      this.formName,
      this.deptName,
      this.personNum,
      this.detailNum});
  @override
  DysupFormTempEntity newIns() {
    return DysupFormTempEntity();
  }
  @override
  fromJson(Map<String, dynamic> json) {
    if (json["Id"] is String) {
      id = json["Id"];
    }
    if (json["DysupDeptId"] is String) {
      dysupDeptId = json["DysupDeptId"];
    }
    if (json["DysupType"] is String) {
      dysupType = json["DysupType"];
    }
    if (json["FormName"] is String) {
      formName = json["FormName"];
    }
    if (json["DeptName"] is String) {
      deptName = json["DeptName"];
    }
    if (json["PersonNum"] is int) {
      personNum = json["PersonNum"];
    }
    if (json["DetailNum"] is int) {
      detailNum = json["DetailNum"];
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = <String, dynamic>{};
    data["Id"] = id;
    data["DysupDeptId"] = dysupDeptId;
    data["DysupType"] = dysupType;
    data["FormName"] = formName;
    data["DeptName"] = deptName;
    data["PersonNum"] = personNum;
    data["DetailNum"] = detailNum;
    return data;
  }
}

泛型接口类 TData

class TData<T extends BaseTData> {
  ///列表的记录数
  int? total;

  ///数据
  List<T>? data;

  ///操作结果,Tag为1代表成功,(默认值)0代表失败
  int? tag;

  ///提示信息或异常信息
  String? message;

  ///扩展Message
  String? description;

  TData({this.total, this.data, this.tag, this.message, this.description});
  TData.fromJson(Map<String, dynamic> json, T entity) {
    total = json['Total'];
    if (json['Data'] != null) {
      data = [];
      json['Data'].forEach((v) {
        entity = entity.newIns();
        entity.fromJson(v);
        data?.add(entity);
      });
    }
    tag = json['Tag'];
    message = json['Message'];
    description = json['Description'];
  }
}

调用示例

TData<DysupFormTempEntity>.fromJson(jsonDecode(body), DysupFormTempEntity());

 

posted @   0Behavior  阅读(408)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示