背景


在开发过程中,服务端通常返回的是JSON格局的数据,对于Web开发人员(JavaScript、TypeScript)中,能够间接拿到JSON数据来做咱们的逻辑。

JSON自身起源于JavaScript,JavaScript解析解决JSON有人造的劣势

但在像 Java、Dart 等强类型语言中,咱们须要将JSON数据转模型对象来应用。

  • 个别状况下,咱们会应用一些第三方库来动静转化Model,然而Flutter中没有像Java的GSON/Jackson这类JSON序列化库。
  • 因为Flutter中禁用运行时反射。官网解释是运行时反射会烦扰Dart的Tree Shaking,应用Tree Shaking能够在Release版中去除未应用的代码,这能够显著优化应用程序的大小。
  • 因为反射会默认利用到Dart的反射性能,而正因如此也就无奈实现动态化转Model的性能。

序列化的几种计划


Flutter官网举荐的有两种序列化计划:https://flutterchina.club/json/

  1. 小我的项目手动序列化,这种计划比较简单,比拟适宜小我的项目简略的JSON转换,但我的项目宏大,或者多人单干,容易出错,也不易保护。

    Flutter有一个内置dart:convert库应用 dart:convert手动序列化JSON
  2. 在大中型我的项目中应用代码生成,须要用到以下三个依赖包,通过代码主动生成的形式,生成模型。这种计划易保护,因为序列化数据代码不再须要手动编写或者保护,你能够将序列化 JSON 数据在运行时的异样危险降到最低;

    • json_annotation
    • json_serializable
    • build_runner

转换流程


  1. 在pubspec.yaml中增加依赖
json_annotation: ^3.1.0json_serializable: ^3.5.0build_runner: ^1.0.0

在Android Stuido中执行Pub get

  1. 新建模型类(mode/demo_model.dart)
class DemoModel{    }
  1. 在网页上把后端申请到的JSON数据转换成Model:

    https://czero1995.github.io/json-to-model/:网站转换反对有限档次嵌套简单对象的转换

  • 比方将以下JSON数据复制到网页上(右边):
{  "code": 0,  "data": {    "avatar": "xxx.png",    "id": 7,    "float":0.1,    "is_deleted": false,    "nickname": "nickName",    "openId": null,    "phone": "13641418383",    "store_ids": [1,2],    "updated": "2020-11-05 11:53:10",    "more":[{"a":1,"b":"b","c":{"c1":0.2,"c2":2}}]  }}
  • 而后转换成Model数据(左边)
import 'package:json_annotation/json_annotation.dart';part 'demo_model_data.g.dart'; @JsonSerializable(explicitToJson: true)class DemoModelModel {    DemoModelData data;    DemoModelModel({      this.data,      this.code,      this.message    });    factory DemoModelModel.fromJson(Map<String, dynamic> json) => _$DemoModelModelFromJson(json);    Map<String, dynamic> toJson() => _$DemoModelModelToJson(this);}@JsonSerializable(explicitToJson: true)class DemoModelData {    String avatar;    int id;    double float;    bool is_deleted;    String nickname;    var openId;    String phone;    List<int> store_ids;     String updated;    List<MoreData> more;     DemoModelData({        this.avatar,         this.id,         this.float,         this.is_deleted,         this.nickname,         this.openId,         this.phone,         this.store_ids,         this.updated,         this.more,     });  factory DemoModelData.fromJson(Map<String, dynamic> json) => _$DemoModelDataFromJson(json);  Map<String, dynamic> toJson() => _$DemoModelDataToJson(this);}@JsonSerializable(explicitToJson: true) class MoreData{     int a;    String b;    CData c;    MoreData({        this.a,         this.b,         this.c,     });    factory MoreData.fromJson(Map<String, dynamic> json) => _$MoreDataFromJson(json);    Map<String, dynamic> toJson() => _$MoreDataToJson(this);}@JsonSerializable(explicitToJson: true) class CData{     double c1;    int c2;    CData({        this.c1,         this.c2,     });    factory CData.fromJson(Map<String, dynamic> json) => _$CDataFromJson(json);    Map<String, dynamic> toJson() => _$CDataToJson(this);}

再将转换之后的数据复制进去笼罩到demo_model.dart文件上

  1. 执行build_runner

在我的项目终端下执行命令:

flutter pub run build_runner build

执行实现后,会生成demo_model.g.dart文件

整个执行流程如下