Flutter中的JSON和序列化

Flutter中的JSON和序列化

前言:本篇文章适合已经了解Dart基础语法的情况下阅读,若你对于Dart的一些基础语法还不熟悉,请移步于Dart中文网先学习基础语法,在阅读本篇文章:http://dart.goodev.org/guides/language/language-tour#classes

1.在模型类中序列化JSON

JSON:

{
"name": "John Smith",
"email": "[email protected]"
}

引入dart:convert库,jsonDecode(jsonString)可以将JSON字符串转换成Map,jsonEncode(Object)方法将对象转换成JSON字符串。我们只需要建一个模型类将Map和对象相互转换就可以实现序列化。

class User {
  final String name;
  final String email;

  User(this.name, this.email);

  User.fromJson(Map json)
      : name = json['name'],
        email = json['email'];

  Map toJson() =>
    {
      'name': name,
      'email': email,
    };
}

新建user.dart,新建一个fromJson命名构造函数,传入Map即可将Map转化成User对象,toJson函数,将对象转换成Map。

Map userMap = jsonDecode(jsonString);//jsonDecode将JSON字符串转换成Map
var user = new User.fromJson(userMap);//调用命名构造函数获取到获取到对象

print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');

如果要对User进行编码,直接将User对象传递给jsonEncode(user)方法,不需要再调用toJson()方法,因为jsonEncode()已经将这一步做了。

String json = jsonEncode(user);

但是,现实世界的场景通常不会那么简单。您不太可能使用如此小的JSON响应体。嵌套的JSON对象也是常有的。

2.使用代码生成库序列化JSON

json_serializable包,这是一个自动生成的源代码生成器,可为您生成JSON序列化样板。

由于序列化代码不再是手动或手动维护的,因此可以最大限度地降低在运行时出现JSON序列化异常的风险。

在项目中使用json_serializable,您需要一个常规依赖项和两个dev依赖项。简而言之,dev依赖项是我们的应用程序源代码中未包含的依赖项 - 它们仅在开发环境中使用。

pubspec.yaml

dependencies:
  ...
  json_annotation: ^2.0.0

dev_dependencies:
  ...
  build_runner: ^1.0.0
  json_serializable: ^2.0.0

单击编辑器上方的Packages get下载这些包

以json_serializable方式创建模型类

user.dart

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User extends Object {

  @JsonKey(name: 'name')
  String name;

  @JsonKey(name: 'email')
  String email;

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

  factory User.fromJson(Map srcJson) => _$UserFromJson(srcJson);

  Map toJson() => _$UserToJson(this);

}

代码可以根据以下工具一键生成:https://caijinglong.github.io/json2dart/index_ch.html

第一次创建json_serializable类时,会出现以下错误:

1.png

有两种运行代码生成器的方法。

一次性代码生成
通过运行flutter包,在项目根目录中运行build_runner build,可以在需要时为模型生成JSON序列化代码。这会触发一次性构建,该构建遍历源文件,选择相关文件,并为它们生成必要的序列化代码。

尽管这是很方便的,每次当你对你的模型类做了修改的时候,你没必要每次都去手动运行一次。

持续性地生成代码

观察者使我们的源代码生成过程更加方便。它会监听项目文件中的更改,并在需要时自动构建必要的文件。通过在项目根目录中运行flutter packages pub run build_runner watch来启动观察程序。

启动观察器一次,然后把它扔在后台运行是安全的。

使用json_serializable模型:

String jsonData = "{\"name\": \"EasonZzz\",\"eamil\": \"[email protected]\"}";
User user = User.fromJson(jsonDecode(jsonData));

你可能感兴趣的:(Flutter中的JSON和序列化)