Flutter官方提供的Json转Dart类的方案需要先手动写一个Dart model类,然后通过build_runner和json_serializable包提供的相关命令和标注然后再自动生成toJson()和fromJson方法,这种方案最大问题在于需要开发者手动写一个Model类。在一个项目中,我们需要的Model类可能非常多,如果都需要手动反复去做的话会很麻烦、无味。为了解决这个问题,我们做了一个新的开发工具package Json_model, 使用它,可以只用一行命令,就能将Json文件转成Dart 类,我们再也不用手动去写Dart类。
安装
请参考Github文档。
使用
在工程根目录下创建一个名为 "jsons" 的目录;
创建或拷贝Json文件到"jsons" 目录中 ;
运行 pub run json_model (Dart VM工程)or flutter packages pub run json_model(Flutter中) 命令生成Dart model类,生成的文件默认在"lib/models"目录下
例子
Json文件: jsons/user.json
{ "name":"wendux", "father":"$user", //可以通过"$"符号引用其它model类 "friends":"$[]user", // 可以通过"$[]"来引用数组 "keywords":"$[]String", // 同上 "age":20 }
生成的Dart model类:
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(); String name; User father; Listfriends; List keywords; num age; factory User.fromJson(Map json) => _$UserFromJson(json); Map toJson() => _$UserToJson(this); }
@JsonKey
您也可以使用json_annotation包中的“@JsonKey”标注特定的字段。
这个功能在特定场景下非常有用,比如Json文件中有一个字段名为"+1",由于在转成Dart类后,字段名会被当做变量名,但是在Dart中变量名不能包含“+”,我们可以通过“@JsonKey”来映射变量名;
{ "@JsonKey(ignore: true) dynamic":"md", "@JsonKey(name: '+1') int": "loved", //将“+1”映射为“loved” "name":"wendux", "age":20 }
生成文件如下:
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(); @JsonKey(name: '+1') int loved; String name; num age; factory User.fromJson(Mapjson) => _$UserFromJson(json); Map toJson() => _$UserToJson(this); }
测试:
import 'models/index.dart'; void main() { var u = User.fromJson({"name": "Jack", "age": 16, "+1": 20}); print(u.loved); // 20 }
关于 @JsonKey标注的详细内容请参考json_annotation 包;
@Import
另外,提供了一个@Import指令,该指令可以在生成的Dart类中导入指定的文件:
{ "@import":"test_dir/profile.dart", "@JsonKey(ignore: true) Profile":"profile", "name":"wendux", "age":20 }
生成的Dart类:
import 'package:json_annotation/json_annotation.dart'; import 'test_dir/profile.dart'; // 指令生效 part 'user.g.dart'; @JsonSerializable() class User { User(); @JsonKey(ignore: true) Profile profile; //file String name; num age; factory User.fromJson(Mapjson) => _$UserFromJson(json); Map toJson() => _$UserToJson(this); }
更完整的示例请移步这里 .
命令参数
默认的源json文件目录为根目录下名为 "json" 的目录;可以通过 src 参数自定义源json文件目录,例如:
pub run json_model src=json_files
默认的生成目录为"lib/models",同样也可以通过dist 参数来自定义输出目录:
pub run json_model src=json_files dist=data # 输出目录为 lib/data
注意,dist会默认已lib为根目录。
代码调用
如果您正在开发一个工具,想在代码中使用json_model,此时便不能通过命令行来调用json_model,这是你可以通过代码调用:
import 'package:json_model/json_model.dart'; void main() { run(['src=jsons']); //run方法为json_model暴露的方法; }
和可视化生成工具对比
也有一些IDE插件提供了Json转Dart类的功能,它们和Json_model相比:
Json_model需要单独维护一个存放Json文件的文件夹,如果有改动,只需修改Json文件便可重新生成Model类;而IDE插件一般需要用户手动将Json内容拷贝复制到一个输入框中,这样生成之后Json文件没有存档的化,之后要改动就需要手动。
Json_model可以手动指定某个字段引用的其它Model类,可以避免生成重复的类;而IDE插件一般会为每一个Json文件中所有嵌套对象都单独生成一个Model类,即使这些嵌套对象可能在其它Model类中已经生成过。
Json_model 提供了命令行转化方式,可以方便集成到CI等非UI环境的场景。
最后
如果觉得对您有用,欢迎Star,Github Json_model项目地址。
作者:wendux
链接:https://juejin.im/post/5cda2d8ef265da038364e621
本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/yixingminglingjiang-json-wenjianzhuancheng-dart-lei.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:6 月 21, 2019 at 12:04 上午