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());
分类:
Flutter
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现