官方的自动反序列化方法
Flutter Json自动反序列化——json_serializable v1.5.1
第三方自动生成工具json_model及修改版
一行命令,将 JSON 文件转成 Dart 类
我用了这个上面这个文章的json_model来自动生成Dart类,但是原版的类命名只是把文件名的首字母大写,所以不能很好的处理文件名为下划线的情况,比如:
json文件名:user_data.json
,生成的dart类为:User_data
,这样不符合dart的命名规范,正确的类名应该是:UserData
。
我自己fork修改了一下,支持转换类名为大驼峰,并且将依赖packages也更新到当前最新版本。
我修改的版本在:https://github.com/wbtvc/json_model.git
安装
修改pubspec.yaml :
dev_dependencies:
json_model:
git:
url: "https://github.com/wbtvc/json_model.git"
build_runner: ^1.6.0
json_serializable: ^3.0.0
使用
新建目录:jsons
,把json文件放在此目录下。
运行:
flutter packages pub run json_model
第一次可能会失败出现下面错误:
Failed to precompile json_model:build_runner:
Dart_LoadScriptFromKernel: The binary program does not contain 'main'.
pub finished with exit code 1
此时只要再执行一次就可以了。
生成的dart类存储在"lib/models"下面,使用时引用该目录的index.dart
即可。
嵌套类的使用方法
users_data.json
:
{
"count":2,
"errCode": 0,
"errMsg": "ok",
"users":"$[]UserInfo|user_info"
}
user_info.json
{
"name": "abc",
"age": 18
}
以上json文件经过转换自动生成2个类:
class UsersData {
UsersData();
num count;
num errCode;
String errMsg;
List<UserInfo> users;
factory UsersData.fromJson(Map<String,dynamic> json) => _$UsersDataFromJson(json);
Map<String, dynamic> toJson() => _$UsersDataToJson(this);
}
class UserInfo {
SoulContentInfoResp();
String name;
num age;
factory UserInfo.fromJson(Map<String,dynamic> json) => _$UserInfoFromJson(json);
Map<String, dynamic> toJson() => _$UserInfoToJson(this);
}
而且生成的文件名也是跟json文件命名保持一致,全小写加下划线:
users_data.dart
和user_info.dart
。
特别说明:
我的修改版与原版json_model的不同:
"users":"$[]UserInfo|user_info"
这里前面UserInfo
表示类名,"|"符号隔开的user_info
是生成的dart类的文件名,用于UsersData
类中添加import "user_info.dart"
。内置对象比如String
就不用这么麻烦,直接写"$[]String
、"$String
就可以了。
原版的没有"|"符号及之后的文件名,这样生成的文件名很不规范。