Flutter笔记之json序列化

402 阅读1分钟

上一章

Flutter 图片加载

Flutter 中Json的序列化和反序列化

Flutter中没有反射,所有不能使用类似gson的第三方序列化,但是flutter提供了一个 dart:convert的转化器,可以将json转化成map或者list。

使用方法

Map<String,dymanic> module=jsonDecode(json);
List<Map> list=jsonDecode(json);

但是这样写会导致module的类型不确定,导致编译器不会监测到类型问题,实际使用中会导致类型错误,为了防止出现这个问题,可以根据json创建module类,在module定义toJosn和fromJson方法。

example

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() =>
    <String, dynamic>{
      'name': name,
      'email': email,
    };
}

新问题来了,如果每个类都这么写就会很麻烦,官方提供了一个json_serializable都包,自动生成代码模版。 在dev_dependencies (这里是开发中使用包都位置,这里引用的包不会打包到app中)下面导入两个包

build_runner

json_serializable

example

dev_dependencies:
  flutter_test:
    sdk: flutter
  json_serializable: ^3.2.5
  build_runner: ^1.7.4

dart文件中

import 'package:json_annotation/json_annotation.dart';
part 'User.g.dart';
@JsonSerializable()
class User {
  final String name;
  final String email;

  User(this.name, this.email);

  factory User.fromJson(Map<String, dynamic> json)
   =>_$UserFromJson(json);

  Map<String, dynamic> toJson() =>_$UserToJson(this);
}

ps:一开始会报错,因为相关代码还没有生成。

在命令后输入:flutter packages pub run build_runner build

编译成功以后就会在同一目录下生成Use.g.dart文件,里面是相关的代码模板。