Flutter官方提供的Json转Dart类的方案须要先手动写一个Dart model类,而后经过build_runner和json_serializable包提供的相关命令和标注而后再自动生成toJson()
和fromJson
方法,这种方案最大问题在于须要开发者手动写一个Model类。在一个项目中,咱们须要的Model类可能很是多,若是都须要手动反复去作的话会很麻烦、无味。为了解决这个问题,咱们作了一个新的开发工具package Json_model, 使用它,能够只用一行命令,就能将Json文件转成Dart 类,咱们不再用手动去写Dart类。javascript
请参考Github文档。java
pub run json_model
(Dart VM工程)or flutter packages pub run json_model
(Flutter中) 命令生成Dart model类,生成的文件默认在"lib/models"目录下Json文件: jsons/user.json
git
{ "name":"wendux", "father":"$user", //能够经过"$"符号引用其它model类 "friends":"$[]user", // 能够经过"$[]"来引用数组 "keywords":"$[]String", // 同上 "age":20 }
生成的Dart model类:github
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(); String name; User father; List<User> friends; List<String> keywords; num age; factory User.fromJson(Map<String,dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
您也可使用json_annotation包中的“@JsonKey”标注特定的字段。shell
这个功能在特定场景下很是有用,好比Json文件中有一个字段名为"+1",因为在转成Dart类后,字段名会被当作变量名,可是在Dart中变量名不能包含“+”,咱们能够经过“@JsonKey”来映射变量名;json
{ "@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(Map<String,dynamic> json) => _$UserFromJson(json); Map<String, dynamic> 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
指令,该指令能够在生成的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(Map<String,dynamic> json) => _$UserFromJson(json); Map<String, dynamic> 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相比:
若是以为对您有用,欢迎Star,Github Json_model项目地址。