【Flutter】对象Json序列化

247 阅读1分钟

前言

在一般编程语言中实例对象转化为json都是比较方便,但是dart例外,因为Flutter禁用了反射,所以序列化比较麻烦。这里推荐使用 json_serializable 库,主要用来简化dart对象与json对象的转化,以及Json序列化和反序列化代码的自动生成。

json_serializable

安装依赖

flutter pub add json_annotation

dart pub add dev:json_serializable

dart pub add dev:build_runner

json_annotation用来定义注解。json_serializable使用注解生成代码。build_runner执行命令生成代码。

使用

创建模型类user.dart

import 'package:json_annotation/json_annotation.dart';

// 1.指定生成的文件
part 'user.g.dart';

// 2.添加注解,告知此类是要生成Model类的
@JsonSerializable()
class User {
   // 3.可选,添加注解设置此属性对应的json key
  @JsonKey(name: 'name')

  final String name;
  final int age;

  User({required this.name, required this.age});

  // 4、反序列化,固定写法:_${类名}FromJson(json)
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 5、序列化,固定写法:_${类名}ToJson(this)
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

然后执行命令生成user.g.dart文件

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

注意:--delete-conflicting-outputs 是可选项,会自动删除任何现存文件。 user.g.dart文件:

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'user.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

User _$UserFromJson(Map<String, dynamic> json) => User(
      name: json['name'] as String,
      age: (json['age'] as num).toInt(),
    );

Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
      'name': instance.name,
      'age': instance.age,
    };

json字符串转化为dart对象

    String jsonStr = '{"name":"xiao","age":20}';
    Map<String, dynamic> userMap = jsonDecode(jsonStr);
    User u = User.fromJson(userMap);

dart对象转化为json

    User user = new User(name: "hehe", age: 99);
    Map<String, dynamic>  userMap =  user.toJson();
    String str =  jsonEncode(userMap);