Flutter Model反序列化和嵌套

1,665 阅读2分钟

序列化

使用 dart:convert手动序列化JSON

Flutter有一个内置dart:convert库,有Json编码器和解码器。

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 = JSON.decode(json);
var user = new User.fromJson(userMap);
print('Howdy, ${user.name}!');
print('We sent the verification link to ${user.email}.');
///序列化
String json = JSON.encode(user);

使用代码生成库序列化JSON

在pubspec.yaml依赖json_serializable,然后拉取库flutter packages get

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
import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart';(写完part引用之后,运行完命令将会自动生成对应的文件)

///这个标注是告诉生成器,这个类是需要生成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);
}

两种生成方式

一次性生成
通过在我们的项目根目录下运行flutter packages pub run build_runner build,我们可以在需要时为我们的model生成json序列化代码。 这触发了一次性构建,它通过我们的源文件,挑选相关的并为它们生成必要的序列化代码。
遇到的问题Generator cannot target libraries that have not been migrated to null-safety.
版本不对blog.csdn.net/a939006659/…
虽然这非常方便,但如果我们不需要每次在model类中进行更改时都要手动运行构建命令的话会更好。
持续生成
使用_watcher_可以使我们的源代码生成的过程更加方便。它会监视我们项目中文件的变化,并在需要时自动构建必要的文件。我们可以通过flutter packages pub run build_runner watch在项目根目录下运行来启动_watcher_。
只需启动一次观察器,然后并让它在后台运行,这是安全的。

反序列化和序列号

///反序列化
Map userMap = JSON.decode(json);
var user = new User.fromJson(userMap);
///序列化
String json = JSON.encode(user);

嵌套模型解析

import 'package:json_annotation/json_annotation.dart';
part 'NestModel.g.dart';

class NestModel{

  final name;
  final email;
  final List<NestModel> childrens;
  final NestModel nest;

  NestModel(this.name, this.email, this.childrens,this.nest);

  factory NestModel.fromJson(Map<String, dynamic> json) => _$NestModelFromJson(json);
  Map<String, dynamic> toJson() => _$NestModelToJson(this);
}

这个时候自动序列化的库好处就体现出来了,不用写多个属性的一一赋值,嵌套的反序列化在参数多的时候很难写,这里自动化出来的代码

NestModel _$NestModelFromJson(Map<String, dynamic> json) {
  return NestModel(
    json['name'],
    json['email'],
    (json['childrens'] as List)
        ?.map((e) =>
            e == null ? null : NestModel.fromJson(e as Map<String, dynamic>))
        ?.toList(),
    json['nest'] == null
        ? null
        : NestModel.fromJson(json['nest'] as Map<String, dynamic>),
  );
}

Map<String, dynamic> _$NestModelToJson(NestModel instance) => <String, dynamic>{
      'name': instance.name,
      'email': instance.email,
      'childrens': instance.childrens,
      'nest': instance.nest,
    };