Flutter

Flutter 使用 json_serializable序列化j

2019-09-26  本文已影响0人  kindom_0129

Flutter使用中json、model转换是个麻烦事,官方文档中提供了一种使用方式来序列化json.

json_serializable package包: 它是一个自动化的源代码生成器,可以为我们生成JSON序列化模板。
由于序列化代码不再由我们手写和维护,我们将运行时产生JSON序列化异常的风险降至最低。

具体步骤:

1.在项目中设置json_serializable
要包含json_serializable到我们的项目中,我们需要一个常规和两个开发依赖项。简而言之,开发依赖项是不包含在我们的应用程序源代码中的依赖项。
pubspec.yaml:

dependencies:
  # Your other regular dependencies here
  json_annotation: ^2.0.0

dev_dependencies:
  # Your other dev_dependencies here
  build_runner: ^1.0.0
  json_serializable: ^2.0.0

然后在项目根文件夹中运行 flutter packages get (或者在编辑器中点击 “Packages Get”) 以在项目中使用这些新的依赖项.

2.代码部分

import 'package:json_annotation/json_annotation.dart';

// user.g.dart 将在我们运行生成命令后自动生成
part 'user.g.dart';

///这个标注是告诉生成器,这个类是需要生成Model类的
@JsonSerializable()

class User{
  User(this.name, this.email);

  String name;
  String email;
  //不同的类使用不同的mixin即可
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

注意:必须加上@JsonSerializable()已告知此类需要序列化,此时会有几个错误,无需理会,当命令执行完后会自动解决。

如果需要,自定义命名策略也很容易。例如,如果我们正在使用的API返回带有【snake_case】的对象,但我们想在我们的模型中使用lowerCamelCase, 那么我们可以使用@JsonKey标注:

/// Tell json_serializable that "registration_date_millis" should be
/// mapped to this property.
@JsonKey(name: 'registration_date_millis')
final int registrationDateMillis;

3.运行代码生成器来为我们生成序列化模板

首先到项目根目录下,之后有两种运行代码生成器的方法

flutter packages pub run build_runner build
flutter packages pub run build_runner watch

注意:如果已经生成过了(产生了xxx.g.dart文件),再执行命令时会报错,需要删除原来的.g.dart文件。可以手动删除也可以在命令行里添加--delete-conflicting-outputs来删除

 flutter packages pub run build_runner build --delete-conflicting-outputs

4.如何使用

要通过json_serializable方式反序列化JSON字符串,我们不需要对先前的代码进行任何更改。

Map userMap = JSON.decode(json);
var user = new User.fromJson(userMap);

序列化也一样。调用API与之前相同。

String json = JSON.encode(user);
上一篇 下一篇

猜你喜欢

热点阅读