为了方便数据使用,我们将服务器拿到的数据转换为map类型,但是在使用是大量的数据会让使用map时头大,比如每个map都key都需要手动输入,很是麻烦。

本文使用了json_serializable将map数据转换为类类型,创建我们自己的实体类。使用时,将转换的对象(点)属性就可以了,方便许多。

下文将模型转换进行了封装,包括单个模型以及List嵌套模型,创建BaseEntity泛型模型。

使用:

  在配置文件中添加json_serializable包。

dependencies:
flutter:
sdk: flutter json_serializable: ^3.5.1 #json序列化

在配置文件中添加

dev_dependencies:
flutter_test:
sdk: flutter
integration_test:
sdk: flutter build_runner: ^1.11.0 #用于生成g文件

在以往的配置中需要配置json_annotation类库,但是我发现在最新的json_serializable库中已经存在json_annotation库,可能是已经集成进去了,所以咱们就不写了。

首先准备json数据,我使用的是fastmock在线接口平台,可以写测试数据,挺方便。

例如数据为:

 {
"userImg":"https://img2.woyaogexing.com/2021/01/23/0e945e70341f4626b2f4a7c48991ea9e!400x400.jpeg",
"nickName":"静怡学姐",
"date":"2013-5-12",
"tuijieContent":"为你推荐·19542人已关注ta·获得35124赞同",
"isGuanzhu":false,
"title":"毛孔粗大之后真的不可逆吗?",
"content":"可逆!可逆!可逆!重要的事情说三遍!如果你看完还不清楚自己什么毛孔,可以发私信问我哦,科可以想我付费咨询,记得带自己的简历哦",
"zanCount":1231,
"pinglunCount":55252,
"contentImg":"http://pic.5tu.cn/uploads/allimg/201003/010P0000109240-1.jpg"
}

然后使用这个牛逼工具。将json数据转换为dart实体类数据。点我点我

将json代码拷贝到左边,右边写上实体类名称,下方红色字体为实体类对应的文件名,全小写格式。

复制生成的代码到创建的.dart文件当中,此时程序就报错,找不到

这个文件。这是需要用到刚才带入的类库build_runner中的文件生成命令。

 执行build_runner命令

Terminal运行:flutter packages pub run build_runner build,自动生成g.dart
在工程的Terminal下运行代码: 这是一个实时监控bean中类型变化的。主要依赖库build_runner.

这样文件生成完成。

使用

这样就可以正常使用了。

封装:

如果你这样做了,开发过程中你会发现一个头疼的问题。json转list集合问题。

我们上面用的是单独一个json对象的列子。所以不存在集合,那么接下来我要准备一个集合代码。

List   Json数据。

{
"code":1,
"msg":"成功",
"data":[
{
"userImg":"https://img2.woyaogexing.com/2021/01/23/0e945e70341f4626b2f4a7c48991ea9e!400x400.jpeg",
"nickName":"静怡学姐",
"date":"2013-5-12",
"tuijieContent":"为你推荐·19542人已关注ta·获得35124赞同",
"isGuanzhu":false,
"title":"毛孔粗大之后真的不可逆吗?",
"content":"可逆!可逆!可逆!重要的事情说三遍!如果你看完还不清楚自己什么毛孔,可以发私信问我哦,科可以想我付费咨询,记得带自己的简历哦",
"zanCount":1231,
"pinglunCount":55252,
"contentImg":"http://pic.5tu.cn/uploads/allimg/201003/010P0000109240-1.jpg"
},
{
"userImg":"https://img2.woyaogexing.com/2021/01/23/a8fba61a2ff840ac8722d80b57c74cbc!400x400.jpeg",
"nickName":"静怡学姐",
"date":"2013-5-12",
"tuijieContent":"为你推荐·19542人已关注ta·获得35124赞同",
"isGuanzhu":false,
"title":"毛孔粗大之后真的不可逆吗?",
"content":"可逆!可逆!可逆!重要的事情说三遍!如果你看完还不清楚自己什么毛孔,可以发私信问我哦,科可以想我付费咨询,记得带自己的简历哦",
"zanCount":1231,
"pinglunCount":55252,
"contentImg":"http://pic.5tu.cn/uploads/allimg/201407/010P000040I52Q011-1.jpg"
}
]
}

同样,用工具吧这个代码拷贝进去自己生成。

还是用这个工具点我点我。

得到以下代码:

import 'package:json_annotation/json_annotation.dart'; 

part 'attention_entity.g.dart';

@JsonSerializable()
class AttentionEntity extends Object { @JsonKey(name: 'code')
int code; @JsonKey(name: 'msg')
String msg; @JsonKey(name: 'data')
List<Data> data; AttentionEntity(this.code,this.msg,this.data,); factory AttentionEntity.fromJson(Map<String, dynamic> srcJson) => _$AttentionEntityFromJson(srcJson); Map<String, dynamic> toJson() => _$AttentionEntityToJson(this); } @JsonSerializable()
class Data extends Object { @JsonKey(name: 'userImg')
String userImg; @JsonKey(name: 'nickName')
String nickName; @JsonKey(name: 'date')
String date; @JsonKey(name: 'tuijieContent')
String tuijieContent; @JsonKey(name: 'isGuanzhu')
bool isGuanzhu; @JsonKey(name: 'title')
String title; @JsonKey(name: 'content')
String content; @JsonKey(name: 'zanCount')
int zanCount; @JsonKey(name: 'pinglunCount')
int pinglunCount; @JsonKey(name: 'contentImg')
String contentImg; Data(this.userImg,this.nickName,this.date,this.tuijieContent,this.isGuanzhu,this.title,this.content,this.zanCount,this.pinglunCount,this.contentImg,); factory Data.fromJson(Map<String, dynamic> srcJson) => _$DataFromJson(srcJson); Map<String, dynamic> toJson() => _$DataToJson(this); }

可以看到,代码生成了两个类,一个是我们定义的最外层的实例,一个是我们data数据集合的实例。

使用方式:

_getData(){
ApplicationDioUtils.dioUtil.get(UrlKit.getGuanzhuList,success: (data){
AttentionEntity attentionEntity = AttentionEntity.fromJson(data); print(baseEntity.data[0].title);
},error: (code,message){ });
}

我们得到了集合数据。完美。。~·~

but,这不是我想要的,一般来说我们的json数据都是以这样的方式传输给客户端。

{
"code":1,
"msg":"成功",
"data":{}
}

如果做一个外层实例化,那么也就不用每个实体类中都有这些重复字段了。

先这样。再那样,然后这样。

手动个创建一个baseEntity。内容是这样的

import 'package:flutter_zhihu/models/attention_entity.dart';
import 'package:json_annotation/json_annotation.dart'; part 'base_entity.g.dart'; @JsonSerializable(createToJson: false)
class BaseEntity<T>{ @JsonKey(name: 'code')
int code; @JsonKey(name: 'msg')
String msg; @JsonKey(fromJson: _dataFromJson)
T data; BaseEntity(this.code,this.msg,this.data,); factory BaseEntity.fromJson(Map<String, dynamic> srcJson) => _$BaseEntityFromJson(srcJson); static T _dataFromJson<T>(Object json) {
  //判断json数据是否是map类型
if (json is Map<String, dynamic>) {
    //这里是判断传入的泛型是那个Entity。由于本人没有找到更顺眼的判断方法,只能获取传入泛型的字符串和实体类字符串是否一样来判断了,如果有更好的方式记得告诉我。
if(T.toString() == 'AttentionEntity'){
AttentionEntity.fromJson(json) as T;
}
    //创建一个entity实例,记得在这里写一个
} else if (json is List) {
    //判断json数据是否是list集合
if(T.toString() == 'List<AttentionEntity>'){
return json.map((e) => AttentionEntity.fromJson(e as Map<String,dynamic>)).toList() as T;
}
    //创建一个entity实例,记得在这里写一个
}
  //阴阳json,直接一个报错。
throw ArgumentError.value(
json,
'json',
'Cannot convert the provided data.',
);
} }

好了 ,很简单,baseEntity完成。这下创建实体类的时候,我们只复制data中的json就行了。

开始使用:

  _getData(){
ApplicationDioUtils.dioUtil.get(UrlKit.getGuanzhuList,success: (data){
    //此data已经经过json.decode(response.data)转换了.
BaseEntity<List<AttentionEntity>> baseEntity = BaseEntity.fromJson(data);
BaseEntity<AttentionEntity> baseEntity1 = BaseEntity.fromJson(data); 
print(baseEntity.data[0].title); },error: (code,message){ });

}

搞定。

flutter json_serializable数据模型的建立和封装的更多相关文章

  1. Allegro建立引脚封装概念名词梳理

    首先感谢于博士的60讲的Cadence教学视频,老师讲的还是很有耐心,很细致,谢谢! 目前还只是看到建立PCB封装这一块,正好手头上有个案子在做,边做边学的进度还是要好很多.以前的工作对原理图这一块的 ...

  2. PowerDesigne 建立概念数据模型

    本文主要介绍PowerDesigner概念数据模型以及实体.属性创建. 一.新建概念数据模型1)选择File-->New,弹出如图所示对话框,选择CDM模型(即概念数据模型)建立模型. 2)完成 ...

  3. Flutter 开发小技巧

    1.命令行运行flutter run之后iOS报错:Could not install build/ios/iphones/Runner.app on XXXXX. try lunching Xcod ...

  4. PowerDesigner概念数据模型 CDM

    目标:本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念. 一.概念数据模型概述数据模型是现实世界中数据特征的抽象.数据模型应该满足三个方面的要求:1)能够比较真实地模拟现实世界2 ...

  5. PowerDesigner使用教程 —— 概念数据模型 (转)

    一.概念数据模型概述    概念数据模型也称信息模型,它以实体-联系(Entity-RelationShip,简称E-R)理论为基础,并对这一理论进行了扩充.它从用户的观点出发对信息进行建模,主要用于 ...

  6. 打造属于自己的Altium Designer 3D封装库,不需要懂专门的三维设计软件

    看到Andy_2020发的帖子“Altium Designer专题”之后,对Altium Designer的3D功能很感兴趣,着手自己做一个AD的3D封装库.刚开始按照Andy介绍的方法,学了两天So ...

  7. 浅谈Flutter(一):搭建Flutter开发环境

    学习内容来自: Flutter中文网  . Flutter实战 -------------------------------------------------------------------- ...

  8. PowerDesigner 概念数据模型(CDM) 说明

        ref: https://blog.csdn.net/tianlesoftware/article/details/6871179 关于PowerDesigner的说明参考: PowerDes ...

  9. [转载]DevOps建立全生命周期管理

    全生命周期管理(ALM)领域作为企业DevOps实践的总体支撑,应该说是DevOps领域中最为重要的实践领域,也是所有其他实践的基础设施.现在很多企业都非常重视CI/CD自动化工具的引入和推广,但是对 ...

  10. PowerDesigner教程系列(二)概念数据模型

    目标:本文主要介绍PowerDesigner概念数据模型以及实体.属性创建.一.新建概念数据模型1)选择File-->New,弹出如图所示对话框,选择CDM模型(即概念数据模型)建立模型. 2) ...

随机推荐

  1. 性能测试-性能分析思路以及CPU

    1.性能分析思路 性能测试分析的思路:先分析硬件 .网络. 系统配置.应用程序 硬件: cpu.内存.磁盘.网络.io 4.常见问题处理4.1 常见问题及解决方法如果r经常大于4,且id经常少于40, ...

  2. (0617 ) centos7运行脚本提示: 没有那个文件或目录 :No such file or directory

    https://blog.csdn.net/hehuihh/article/details/88174007 之前也 遇到: https://www.cnblogs.com/fancy2333/p/1 ...

  3. GIS空间分析和建模复习重点4

    27.三维地形分析的方法 常用的有 ·坡度分析 ·坡向分布 ·填挖方分析 ·山体阴影分析 ·通视分析 28.空间分析实际应用 (1)城市应急避难场所是城市防灾减灾规划的重要组成部分,应急避难场所的建设 ...

  4. 【java数据结构与算法】直接戳中"希尔排序"要点,学不会你打我~

    希尔排序: 也叫增量递减排序 是插入排序的优化,分组+排序 Get到重点,那么我们开剖析一下 结合图表和代码,总结如下~public class ShellSort { public static v ...

  5. Goreplay流量回放-使用真实流量测试

    介绍: 1.goreplay是一个开源的网络监控工具,它可以记录你的实时流量,并用于跟踪.负载测试.监控和详细分析. 2.goreplay 是一款从生产环境 copy 流量到测试环境的工具,且不会影响 ...

  6. 在platformio自动上传esp8266固件

    不想每次上传固件的时候手工点按钮,修改这个文件:C:\Users\你的登录名.platformio\platforms\espressif8266\builder\main.py 在319行UPLOA ...

  7. 【Asp.net】服务器控件<asp:TextBox ></TextBox>如何变为多文本控件

    废话不多说,直接上图! 在TextBox上增加TextModel="MultiLine"即可!

  8. 小程序Excel导入导出数据库功能

    https://blog.csdn.net/yhcad/article/details/116204444 unit Umain;interfaceuses  Winapi.Windows, Wina ...

  9. VS编译运行报错:找不到ucrtbased.dll文件

    VS编译运行报错:找不到ucrtbased.dll文件 在VS2019中配置OpenCV编译,报如下错误: 解决方法:下载缺少的ucrtbased.dll文件,在免费的dll下载网站搜索下载,对应的有 ...

  10. linux命令添加至环境变量

    vim /etc/profile 最后一行添加 /usr/local/nginx/sbin/  命令目录 export PATH="/usr/local/nginx/sbin/:$PATH& ...