Flutter实体与JSON解析的一种方法
vs code作为编辑器
1. 首先,json对象与字符串的转换是使用json.encode和json.decode的,需要导入import 'dart:convert';
这里主要的自然不是这个,而是json对象和实体对象的转换
当然,实际上json对象算是一个Map对象,直接通过键访问就可以得到值,即通过实体对象的属性名就可以得到值。
这里只是把这一步通过命令生成而已
2. 导入对应的flutter包
即在pubspec.yaml中添加
dependencies:
json_annotation: ^3.0.0
dev_dependencies:
build_runner: ^1.0.0
json_serializable: ^3.2.0
保存将自动加载,或者终端输入flutter packages get,亦或者vs code中点击“查看-命令面板”再输入Flutterget就会出现
3. 创建实体的dart文件,下面以news为例 —— 可以用https://caijinglong.github.io/json2dart/index_ch.html生成
import 'package:json_annotation/json_annotation.dart';//注意必须导入,不然无法使用@JsonSerializable()
part "news.g.dart";//严格区分大小写,且必须是文件名中间加上g.,否则无法成功。另外也是必须的,因为要生成一个转换部分文件
@JsonSerializable()//注意加上,后面命令识别用
class News extends Object {
final String author;
final String title;
final String description;
final String url;
final String urlToImage;
final String publishedAt;
final Source source;
News(this.author,
this.title,
this.description,
this.url,
this.urlToImage,
this.publishedAt,
this.source);
}
4. 终端输入命令flutter packages pub run build_runner build
等到成功,每个json序列化都将会有一个输出
这样就生成好了一个转换类news.g.dart,此时转换文件中有_$NewsFromJson方法
你会发现竟然是报错的??那是因为你主类中缺少了命名式构造函数,加上即可
factory News.fromJson(Map<String, dynamic> json) => _$NewsFromJson(json);
5. 这样,你就可以通过命名构造函数从json对象转换为实体对象了
6. 当然还要说说缺陷和坑:
1)泛型无法成功
2)最好确定文件名后再执行命令,不然重命名可能会发生很难解决的事情