关于flutter:Flutter-JSON转Model

230次阅读

共计 2608 个字符,预计需要花费 7 分钟才能阅读完成。

背景


在开发过程中,服务端通常返回的是 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.0
json_serializable: ^3.5.0
build_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 文件

整个执行流程如下

正文完
 0