Flutter JSON序列化与反序列化插件json_serializable_generic的使用

Flutter JSON序列化与反序列化插件json_serializable_generic的使用

本包提供了一种JSON序列化的机制。你可以将这种行为添加到任何你喜欢的类中。

开始使用

首先,你需要创建一个新的类或使用现有的类,然后添加JsonSerializable混入,如以下代码所示:

class User with JsonSerializable {
  final int id;
  final String name;
  final int age;

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

注意:确保你的构造函数使用命名参数。

在添加了JsonSerializable后,你的类将会新增以下方法:

  • toMap - 如果你想将当前实例转换为Map结构,可以使用此方法。
  • toJson - 如果你想将当前实例转换为JSON编码的数据,可以使用此方法。
  • fromMap - 如果你想将一个Map结构转换为类实例,可以使用此方法。
  • fromJson - 如果你想将一个JSON编码的数据转换为类实例,可以使用此方法。

要导入json_serializable包:

import 'package:json_serializable/json_serializable.dart';

完整示例

下面是一个完整的示例,展示了如何使用json_serializable进行序列化和反序列化:

import 'package:json_serializable/json_serializable.dart';

import 'models/user_model.dart'; // 假设你已经定义了一个UserModel类

void exampleWithMap() {
  var commonUser = User(id: 1, name: 'Dash', age: 10);

  print(commonUser.toMap()); // 输出当前用户对象的Map表示

  var parsedUser = JsonSerializable.fromMap<User>(commonUser.toMap());

  print(parsedUser.toMap()); // 输出解析后的用户对象的Map表示
}

void exampleWithJson() {
  var commonUser = User(id: 1, name: 'Dash', age: 10);

  print(commonUser.toJson()); // 输出当前用户对象的JSON字符串

  var parsedUser = JsonSerializable.fromJson<User>(commonUser.toJson());

  print(parsedUser.toJson()); // 输出解析后的用户对象的JSON字符串
}

void main() {
  try {
    exampleWithMap();
    exampleWithJson();
  } catch (e) {
    print(e); // 捕获并打印任何可能发生的异常
  }
}

额外功能

现在,你可以在toMapfromMap方法中使用可选参数,如果你想在将类转换为Map时排除某些变量,可以通过传递一个List<String>来实现。同样的想法也可以用于从Map数据创建类实例时排除某些字段。

使用toMap方法排除键值

var user = User(id: 1, name: 'Dash', age: 10);

print(user.toMap(excludes: ['id'])); // 输出不包含'id'的Map

// {name: Dash, age: 10}

使用fromMap方法排除键值

var mapUser = {
  "id": 2,
  "name": "foo",
  "lastName": "bar",
  "age": 11,
};

var user = 
  JsonSerializable.fromMap<User>(mapUser, excludes: ['lastName']);

print(user.toMap()); // 输出不包含'lastName'的Map

// {id: 2, name: foo, age: 11}

更多关于Flutter JSON序列化与反序列化插件json_serializable_generic的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON序列化与反序列化插件json_serializable_generic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中,json_serializable 是一个常用的库,用于自动化生成JSON序列化与反序列化的代码。json_serializable_generic 是一个扩展库,它支持泛型类型的序列化与反序列化。下面是使用 json_serializable_generic 的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.3.3
  json_serializable: ^6.6.1
  json_serializable_generic: ^0.3.0

2. 创建模型类

接下来,创建一个模型类,并使用 @JsonSerializableGeneric 注解来支持泛型类型。

import 'package:json_annotation/json_annotation.dart';
import 'package:json_serializable_generic/json_serializable_generic.dart';

part 'example_model.g.dart';

@JsonSerializableGeneric()
class ExampleModel<T> {
  final T data;
  final String message;

  ExampleModel({required this.data, required this.message});

  factory ExampleModel.fromJson(Map<String, dynamic> json) => _$ExampleModelFromJson<T>(json);

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

3. 生成序列化代码

运行 build_runner 生成序列化代码:

flutter pub run build_runner build

这将会生成 example_model.g.dart 文件,其中包含 _$ExampleModelFromJson_$ExampleModelToJson 方法的实现。

4. 使用模型类

现在你可以使用这个模型类来进行JSON的序列化与反序列化。

void main() {
  // 反序列化
  final jsonString = '{"data": 42, "message": "Hello"}';
  final jsonMap = jsonDecode(jsonString);
  final exampleModel = ExampleModel<int>.fromJson(jsonMap);

  print(exampleModel.message); // 输出: Hello
  print(exampleModel.data);    // 输出: 42

  // 序列化
  final newExampleModel = ExampleModel<int>(data: 100, message: 'World');
  final newJsonMap = newExampleModel.toJson();
  final newJsonString = jsonEncode(newJsonMap);

  print(newJsonString); // 输出: {"data":100,"message":"World"}
}

5. 处理复杂泛型类型

如果你需要在模型类中使用更复杂的泛型类型,比如 List<T>Map<String, T>json_serializable_generic 也可以处理。

@JsonSerializableGeneric()
class ComplexModel<T> {
  final List<T> items;
  final Map<String, T> metadata;

  ComplexModel({required this.items, required this.metadata});

  factory ComplexModel.fromJson(Map<String, dynamic> json) => _$ComplexModelFromJson<T>(json);

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

6. 运行 build_runner 并测试

再次运行 build_runner 生成代码,并测试复杂泛型类型的序列化与反序列化。

flutter pub run build_runner build
回到顶部