目前App
请求后台数据,后台返回的数据格式主流都是用json
,以下是记录 Flutter
解析 json
数据以及模型化。
模拟场景
进行一个模拟考勤系统,这里主要是实现一个请假列表功能,列表展示的数据很简单,主要包括 申请时间
、工号
、请假类型
、开始时间
、结束时间
、请假时间
、审批结果
、假单ID
这些信息。
模拟 Json 数据
[
{
"leaveId":"2",
"applicationTime":"2019-11-23 14:30",
"numberId":"21523645",
"userName":"张三",
"leaveType":"年假",
"beginTime":"2019-11-26 09:00",
"endTime":"2019-10-26 18:30",
"leaveDuration":"1天",
"approvalResults":"审批通过"
},
{
"leaveId":"2",
"applicationTime":"2019-11-23 14:40",
"numberId":"21523645",
"userName":"张三",
"leaveType":"年假",
"beginTime":"2019-11-27 09:00",
"endTime":"2019-10-27 18:30",
"leaveDuration":"1天",
"approvalResults":"审批不通过"
}
]
以上就是模拟的Json
数据,接下来利用model
进行解析。
解析 Json
数据,模型化处理
第一种方式:自己创建模型,并且一一解析(太费劲,不推荐)
在这里不做多余的解析,如果需要可以看 Flutter
中文网Json
转Dart Model
类,这种方式太繁琐,在开发场景中,大多数都会出现 model
嵌套 model
的数据,实在是太费劲了。
第二种方式:前人栽树后人乘凉,利用工具进行Model
解析
- 将
Json
字符串拷贝到 这里,进行自动创建model
.
- 在工程中创建
model.dart
文件,并将右边生成的model
复制到model.dart
中去。
- 添加依赖,在
pubspec.yaml
中对应的位置添加一下代码
dependencies:
flutter:
sdk: flutter
# The following adds the Cupertino Icons font to your application.
# Use with the CupertinoIcons class for iOS style icons.
json_annotation: ^3.0.0
dev_dependencies:
flutter_test:
sdk: flutter
# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
build_runner: ^1.7.2
json_serializable: ^3.2.3
- 点击
Packages get
,更新完了,再下一步操作
- 粘贴完毕后,编译器会出现错误,这时候不急,打开终端工具,进入当前工程路径,运行
flutter packages pub run build_runner build
,然后静静等待。
- 这时候就跑完了,工程目录下多了一个命名为
model.g.dart
文件,这里我的是leave_list_model.g.dart
。
到了这一步代表着 model
文件创建完毕,接下来就是json
解析了。
- 将上面的
json
数据复制到代码中
List<Map<String, String>> jsonList = [
{
"leaveId": "2",
"applicationTime": "2019-11-23 14:30",
"numberId": "21523645",
"userName": "张三",
"leaveType": "年假",
"beginTime": "2019-11-26 09:00",
"endTime": "2019-10-26 18:30",
"leaveDuration": "1天",
"approvalResults": "审批通过"
},
{
"leaveId": "2",
"applicationTime": "2019-11-23 14:40",
"numberId": "21523645",
"userName": "张三",
"leaveType": "年假",
"beginTime": "2019-11-27 09:00",
"endTime": "2019-10-27 18:30",
"leaveDuration": "1天",
"approvalResults": "审批不通过"
}
];
- 解析数据
8.1 创建一个 list
,用于存放model
数据
List<LeaveListModel> modelList = List();
8.2 遍历 jsonList
进行解析
for (int i = 0; i < jsonList.length; i++) {
modelList.add(LeaveListModel.fromJson(jsonList[i]));
}
这样就解析完毕了,最后展示出来
若运行 flutter packages pub run build_runner build
报
[SEVERE] Conflicting outputs were detected and the build is unable to prompt for permission to remove them. These outputs must be removed manually or the build can be run with `--delete\-conflicting-outputs\`
错误,需要执行 flutter packages pub run build_runner build --delete-conflicting-outputs