美文网首页
JSON和序列化

JSON和序列化

作者: 柳源居士 | 来源:发表于2019-08-14 00:23 被阅读0次

flutter 里面因为tree shaking的使用,并不提供类似GSON / Jackson / Moshi等的Json转换库。因此才需要使用手动序列化或者自动序列化。

tree shaking

tree-shaking可以理解为通过工具"摇"我们的JS文件,将其中用不到的代码"摇"掉,是一个性能优化的范畴。

json 对象是通过一个字符串来赋值。
如:

var json='{"name":"dart","type":"language"}';
  1. flutter 手动序列化
    手动JSON序列化是指使用flutter内置的库 dart:convert 中内置的JSON解码器。它将原始JSON字符串传递给JSON.decode() 方法,然后在返回的Map<String, dynamic>中查找所需的值。 它没有外部依赖或其它的设置,对于小项目很方便。
//把json对象解码成数组对象
var data = jsonDecode(json);
String result = data['name'];
  • 在模型类中序列化JSON
    把json对应成model,然后添加fromJson的构造方法和toJson的方法,用来转换。
class User {
  final String name;
  final String email;

  User(this.name, this.email);

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

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

使用方式:

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

print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');
  1. 自动序列化
    当项目变大,手动序列化难以维护或者容易出错,就需要自动序列化。
    代码生成功能的JSON序列化是指通过外部库为您自动生成序列化模板。它需要一些初始设置,并运行一个文件观察器,从您的model类生成代码。
    1. 设置依赖
      pubspec.yaml中添加依赖:
dependencies:
  json_annotation: ^2.0.0

dev_dependencies:
  build_runner: ^1.0.0
  json_serializable: ^2.0.0
    1. 添加model,并添加注解
    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);
    }
    
    1. 设置bulid方式
  1. 手动方式:一次性生成
    在项目根目录或者IDEA terminal中输入:
flutter packages pub run build_runner build

  1. 自动方式:持续生成
    在项目根目录或者IDEA terminal中输入:
flutter packages pub run build_runner watch

它会监视我们项目中文件的变化,并在需要时自动构建必要的文件。源代码生成器创建一个名为user.g.dart的文件,它具有所有必需的序列化逻辑。

如果需要,自定义命名策略也很容易。例如,如果我们正在使用的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;

相关文章

网友评论

      本文标题:JSON和序列化

      本文链接:https://www.haomeiwen.com/subject/frvadctx.html