Flutter JSON序列化与反序列化
文章目录Flutter JSON序列化与反序列化概述手写序列化数据模型处理JSON对象处理JSON数组json_serializable添加依赖数据模型生成序列化代码处理JSON对象处理JSON数组嵌套对象处理类型不匹配问题dart_mappable添加依赖数据模型生成序列化代码处理JSON对象处理JSON数组在线网站生成JsonToDart插件生成Flutter JSON序列化与反序列化概述在 Flutter/Dart 开发中网络请求、本地缓存的数据大多为 JSON 格式而 Dart 无法直接操作 JSON 字符串必须通过序列化与反序列化完成数据转换。概念序列化打包流程将业务对象转为可传输/可存储Dart 实体对象 - MapString,dynamic - JSON字符串反序列化解析流程将数据转为业务对象JSON字符串 - MapString,dynamic - Dart 实体对象目前序列化有三种方案手写序列化适合小型项目json_serializable官方推荐适合绝大多数项目dart_mappable第三方库开发迅速手写序列化数据模型classUser{finalint id;finalStringname;finalint age;finalbool sex;User({requiredthis.id,requiredthis.name,requiredthis.age,requiredthis.sex,});factoryUser.fromJson(MapString,dynamicjson){returnUser(id:json[id],name:json[name],age:json[age],sex:json[sex],);}MapString,dynamictoJson(){return{id:id,name:name,age:age,sex:sex};}overrideStringtoString(){returnUser{id:$id, name:$name, age:$age, sex:$sex};}}处理JSON对象StringjsonStr {id: 1,name: 小明,age: 18,sex: true} ;// 反序列化MapString,dynamicuserMapjson.decode(jsonStr);UseruserUser.fromJson(jsonMap);print(user);// 序列化MapString,dynamicuserMapuser.toJson();StringresultJsonjson.encode(userMap);print(resultJson);处理JSON数组StringjsonStr [ {id: 1,name: 小明,age: 18,sex: true}, {id: 2,name: 小白,age: 19,sex: false}, {id: 3,name: 小黑,age: 20,sex: true} ] ;// 反序列化ListdynamicjsonListjson.decode(jsonStr);ListUseruserListjsonList.map((e)User.fromJson(e)).toList();print(userList);// 序列化ListMapString,dynamiclistuserList.map((e)e.toJson()).toList();StringresultJsonjson.encode(list);print(resultJson);json_serializable添加依赖dependencies:json_annotation:^4.9.0dev_dependencies:build_runner:^2.4.0json_serializable:^6.8.0json_annotation提供序列化注解生产依赖build_runnerDart 代码生成工具开发依赖json_serializable序列化代码生成核心开发依赖数据模型importpackage:json_annotation/json_annotation.dart;// 自动生成关联文件必须与文件名一致partusers.g.dart;JsonSerializable()classUser{finalint id;finalStringname;finalint age;finalbool sex;User({requiredthis.id,requiredthis.name,JsonKey(defaultValue:0)requiredthis.age,requiredthis.sex,});// 反序列化工厂方法固定写法factoryUser.fromJson(MapString,dynamicjson)_$UserFromJson(json);// 序列化方法固定写法MapString,dynamictoJson()_$UserToJson(this);}生成序列化代码在项目根目录下执行命令自动生成 .g.dart 代码# 一次性生成代码正式打包前使用 flutter pub run build_runner build # 监听文件变化自动更新代码开发调试首选 flutter pub run build_runner watch # 清理缓存、强制重新生成报错时使用 flutter pub run build_runner build --delete-conflicting-outputs处理JSON对象// 反序列化StringjsonStr {id: 1,name: 小明,age: 18,sex: true} ;MapString,dynamicuserMapjson.decode(jsonStr);UseruserUser.fromJson(userMap);print(user);// 序列化UseruserUser(id:1,name:小明,age:18,sex:true);MapString,dynamicuserMapuser.toJson();StringresultJsonjson.encode(userMap);print(resultJson);处理JSON数组// 反序列化StringjsonStr [ {id: 1,name: 小明,age: 18,sex: true}, {id: 2,name: 小白,age: 19,sex: false}, {id: 3,name: 小黑,age: 20,sex: true} ] ;ListdynamicmapListjson.decode(jsonStr);ListUseruserListmapList.map((e)User.fromJson(e)).toList();print(userList);// 序列化ListUseruserList[User(id:1,name:小明,age:18,sex:true),User(id:2,name:小白,age:19,sex:false),User(id:3,name:小黑,age:20,sex:true),];ListMapString,dynamicmapListuserList.map((e)e.toJson()).toList();StringresultJsonjson.encode(mapList);print(resultJson);嵌套对象// 反序列化StringjsonStr [ {id: 1,name: 小明,age: 18,sex: true,city:[湖北省,武汉市]}, {id: 2,name: 小白,age: 19,sex: false,city:[湖南省,长沙市]}, {id: 3,name: 小黑,age: 20,sex: true,city:[广东省,广州市]} ] ;ListdynamicmapListjson.decode(jsonStr);ListUseruserListmapList.map((e)User.fromJson(e)).toList();print(userList);处理类型不匹配问题// 自定义转换器String转intintstringToInt(dynamicvalue)int.parse(value.toString());JsonSerializable()classUser{JsonKey(fromJson:stringToInt)finalint id;finalStringname;finalint age;finalbool sex;}StringjsonStr {id: 1,name: 小明,age: 18,sex: true} ;MapString,dynamicmapjson.decode(jsonStr);UseruserUser.fromJson(map);print(user);dart_mappabledart_mappable 无需手写固定的 fromJson/toJson自动生成 copyWith、相等判断、toString开发效率更高。添加依赖dependencies:dart_mappable:^4.0.0dev_dependencies:build_runner:^2.4.0数据模型importpackage:dart_mappable/dart_mappable.dart;partusers.mapper.dart;MappableClass()classUserwithUserMappable{finalint id;finalStringname;finalint age;finalbool sex;User(this.id,this.name,this.age,this.sex);}生成序列化代码flutter pub run build_runner build处理JSON对象// 反序列化StringjsonStr {id: 1,name: 小明,age: 18,sex: true} ;UseruserUserMapper.fromJson(jsonStr);print(user);// 序列化UseruserUser(1,小明,18,true);Stringjsonuser.toJson();print(json);处理JSON数组// 反序列化StringjsonStr [ {id: 1, name: 小明, age: 18, sex: true}, {id: 2, name: 小白, age: 19, sex: false} ] ;ListdynamicmapListjson.decode(jsonStr);ListUseruserListmapList.map((e)UserMapper.fromMap(e)).toList();print(userList);// 序列化ListUseruserList[User(1,小白,18,true),User(1,小黑,18,true)];ListStringresultJsonuserList.map((e)e.toJson()).toList();print(resultJson);在线网站生成https://app.quicktype.io/JsonToDart插件生成在AndroidStudio中安装JsonToDart插件然后选定目录点击右键选择New - Json to Dart或快捷键ALT Shift D自动生成Model类。