Flutter JSON序列化与不可变集合插件json_serializable_immutable_collections的使用

Flutter JSON序列化与不可变集合插件json_serializable_immutable_collections的使用

json_serializable_immutable_collections

Pub Package

(json_serializable_immutable_collections) 是一个扩展 json_serializable 功能的非官方插件,支持更多类型的集合序列化。

特性:

  • 行为类似于 json_serializable。
  • 支持以下更多集合类型:
    • 所有 json_serializable 支持的类型。
    • BuiltList。
    • BuiltSet。
    • BuiltMap。
    • KtList。
    • KtSet。
    • KtMap。

如果您希望支持更多类型,请随时提交问题或拉取请求。


如何使用

1. 添加依赖

pubspec.yamldev_dependencies 中添加:

    json_serializable_immutable_collections: <current_version>

2. 配置 build.yaml

创建或修改 build.yaml 文件(必要时避免与 json_serializable 冲突):

    targets:
      $default:
        builders:
          json_serializable_immutable_collections:
            # 配置选项,与 json_serializable 类似
            options:
              explicit_to_json: true
          json_serializable:json_serializable:
            generate_for:
              # 排除所有文件以避免冲突,此库使用自定义构建器
              include:
              exclude:
                - test/**
                - lib/**

示例代码

以下是一个完整的示例,展示如何使用 json_serializable_immutable_collections 对不可变集合进行序列化和反序列化。

main.dart

import 'package:json_annotation/json_annotation.dart'; // 引入 json_annotation
import 'package:kt_dart/kt.dart'; // 引入 kt_dart 库

// 生成部分代码
part 'main.g.dart';

// 使用 @JsonSerializable 注解标记类
@JsonSerializable()
class Model {
  // 定义一个不可变的 KtList<int>
  final KtList<int> myIntList;

  // 构造函数
  Model({required this.myIntList});

  // 从 JSON 反序列化
  factory Model.fromJson(Map<String, dynamic> json) => _$ModelFromJson(json);

  // 将对象序列化为 JSON
  Map<String, dynamic> toJson() => _$ModelToJson(this);
}

void main() {
  // 创建一个不可变列表并打印其 JSON 表示
  print(
    Model(myIntList: KtList.of(1, 2, 3)).toJson()
  );
}

输出结果

运行上述代码后,将得到以下输出:

{"myIntList":[1,2,3]}

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

1 回复

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


在 Flutter 中,json_serializable 是一个非常流行的库,用于自动生成 JSON 序列化和反序列化代码。而 json_serializable_immutable_collections 是一个扩展插件,专门用于处理不可变集合(如 KtList, KtSet, KtMap 等)的序列化和反序列化。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.7.0
  kt_dart: ^0.11.0

dev_dependencies:
  build_runner: ^2.1.7
  json_serializable: ^6.3.1
  json_serializable_immutable_collections: ^1.1.0
  • json_annotation: 用于定义 JSON 序列化的注解。
  • kt_dart: 提供了不可变集合的实现。
  • build_runner: 用于生成代码。
  • json_serializable: 自动生成 JSON 序列化和反序列化代码。
  • json_serializable_immutable_collections: 扩展 json_serializable 以支持不可变集合。

2. 创建数据模型

接下来,创建一个数据模型类,并使用 @JsonSerializable 注解标记它。使用 KtList, KtSet, KtMap 等不可变集合类型。

import 'package:json_annotation/json_annotation.dart';
import 'package:kt_dart/kt.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  final String name;
  final KtList<String> hobbies;
  final KtMap<String, int> scores;

  User({
    required this.name,
    required this.hobbies,
    required this.scores,
  });

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

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

3. 生成代码

运行以下命令生成序列化和反序列化代码:

flutter pub run build_runner build

这将生成 user.g.dart 文件,其中包含 User 类的 fromJsontoJson 方法。

4. 使用生成的代码

现在你可以使用生成的代码来序列化和反序列化 User 对象。

void main() {
  final user = User(
    name: 'John Doe',
    hobbies: listOf('Reading', 'Swimming'),
    scores: mapFrom({'Math': 90, 'Science': 85}),
  );

  // 序列化
  final json = user.toJson();
  print(json);

  // 反序列化
  final decodedUser = User.fromJson(json);
  print(decodedUser);
}

5. 输出示例

假设你有一个 User 对象,序列化后的 JSON 可能如下:

{
  "name": "John Doe",
  "hobbies": ["Reading", "Swimming"],
  "scores": {
    "Math": 90,
    "Science": 85
  }
}
回到顶部