Flutter数据序列化插件dart_serializer的使用

发布于 1周前 作者 ionicwang 来自 Flutter

Flutter数据序列化插件dart_serializer的使用

dart_serializer 是一个用于从JSON文件自动生成Dart数据模型的Dart包。它通过方便的命令行接口(CLI)简化了创建Dart类的过程,使得在Dart项目中更轻松地处理JSON API和数据集。

特性

  • 自动Dart类生成:快速从JSON文件生成Dart类。
  • 支持嵌套结构:轻松处理嵌套对象、数组和各种数据类型。
  • 可定制的命名约定:根据项目的命名约定调整类名和字段名。
  • 无缝CLI集成:轻松将数据模型生成整合到工作流程中。

安装

确保你的系统上已经安装了Dart。如果没有,可以从Dart官网下载。安装完成后,全局激活 dart_serializer

dart pub global activate dart_serializer

使用

安装完 dart_serializer 后,你可以使用以下命令行工具从JSON文件生成Dart数据模型。以下是具体步骤:

准备JSON文件

创建一个定义数据结构的JSON文件。例如,example.json 文件内容如下:

{
  "name": "张三",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "state": "Anystate",
    "zipcode": "12345"
  }
}

运行生成命令

运行以下命令,其中路径指向你的JSON文件:

dart run dart_serializer:generate path/to/your/file.dart

生成的Dart类

dart_serializer 将根据JSON数据的结构生成Dart类。生成的类将保存在当前目录下。

使用生成的Dart类

现在你可以在Dart代码中使用这些生成的类来解析JSON数据为Dart对象,反之亦然。

非空安全

你还可以通过传递 nullable 参数生成可空的Dart类。例如:

dart run dart_serializer:generate path/to/your/file.dart nullable

示例代码

以下是一个完整的示例代码,展示了如何使用 dart_serializer 生成Dart类并使用它们解析JSON数据。

1. 创建JSON文件

首先,创建一个名为 example.json 的文件,并添加以下内容:

{
  "name": "张三",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "state": "Anystate",
    "zipcode": "12345"
  }
}

2. 运行生成命令

在终端中运行以下命令:

dart run dart_serializer:generate example.dart

这将生成一个 example.dart 文件,内容类似于:

class Address {
  String street;
  String city;
  String state;
  String zipcode;

  Address({
    required this.street,
    required this.city,
    required this.state,
    required this.zipcode,
  });

  factory Address.fromJson(Map<String, dynamic> json) {
    return Address(
      street: json['street'],
      city: json['city'],
      state: json['state'],
      zipcode: json['zipcode'],
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'street': street,
      'city': city,
      'state': state,
      'zipcode': zipcode,
    };
  }
}

class Person {
  String name;
  int age;
  Address address;

  Person({
    required this.name,
    required this.age,
    required this.address,
  });

  factory Person.fromJson(Map<String, dynamic> json) {
    return Person(
      name: json['name'],
      age: json['age'],
      address: Address.fromJson(json['address']),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'name': name,
      'age': age,
      'address': address.toJson(),
    };
  }
}

3. 在Dart代码中使用生成的类

在Dart代码中,你可以使用生成的类来解析JSON数据:

import 'example.dart';

void main() {
  // 读取JSON文件
  final jsonString = '{"name": "张三", "age": 30, "address": {"street": "123 Main St", "city": "Anytown", "state": "Anystate", "zipcode": "12345"}}';
  
  // 解析JSON字符串
  final person = Person.fromJson(json.decode(jsonString));
  
  // 打印信息
  print('姓名: ${person.name}');
  print('年龄: ${person.age}');
  print('地址: ${person.address.street}, ${person.address.city}, ${person.address.state} ${person.address.zipcode}');
}

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

1 回复

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


dart_serializer 是一个用于 Dart 和 Flutter 应用程序的序列化和反序列化库。它允许你轻松地将 Dart 对象转换为 JSON 或其他格式,并将 JSON 转换回 Dart 对象。以下是如何使用 dart_serializer 的基本步骤。

1. 添加依赖

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

dependencies:
  dart_serializer: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 创建模型类

假设你有一个 User 类,你需要为它添加序列化和反序列化支持。

import 'package:dart_serializer/dart_serializer.dart';

[@Serializable](/user/Serializable)()
class User {
  String name;
  int age;
  String email;

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

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

3. 生成序列化代码

dart_serializer 使用代码生成来生成序列化和反序列化代码。你需要运行以下命令来生成代码:

flutter pub run build_runner build

这将生成一个名为 user.g.dart 的文件,其中包含 _$UserFromJson_$UserToJson 的实现。

4. 使用生成的代码

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

import 'user.dart';

void main() {
  // 反序列化
  Map<String, dynamic> json = {
    'name': 'John Doe',
    'age': 30,
    'email': 'john.doe@example.com'
  };
  User user = User.fromJson(json);

  print('Name: ${user.name}');
  print('Age: ${user.age}');
  print('Email: ${user.email}');

  // 序列化
  Map<String, dynamic> userJson = user.toJson();
  print('User JSON: $userJson');
}

5. 处理嵌套对象

如果你的模型类中包含嵌套对象,dart_serializer 也可以轻松处理。

[@Serializable](/user/Serializable)()
class Address {
  String street;
  String city;
  String zipCode;

  Address({required this.street, required this.city, required this.zipCode});

  factory Address.fromJson(Map<String, dynamic> json) => _$AddressFromJson(json);
  Map<String, dynamic> toJson() => _$AddressToJson(this);
}

[@Serializable](/user/Serializable)()
class User {
  String name;
  int age;
  String email;
  Address address;

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

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

6. 处理列表和映射

dart_serializer 也支持列表和映射的序列化和反序列化。

[@Serializable](/user/Serializable)()
class User {
  String name;
  int age;
  String email;
  List<String> hobbies;
  Map<String, dynamic> metadata;

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

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

7. 自定义序列化

如果你需要自定义序列化逻辑,可以通过覆盖 toJsonfromJson 方法来实现。

[@Serializable](/user/Serializable)()
class User {
  String name;
  int age;
  String email;

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

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      name: json['full_name'],
      age: json['user_age'],
      email: json['user_email'],
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'full_name': name,
      'user_age': age,
      'user_email': email,
    };
  }
}

8. 处理枚举

dart_serializer 也支持枚举类型的序列化和反序列化。

enum UserRole { admin, user, guest }

[@Serializable](/user/Serializable)()
class User {
  String name;
  int age;
  String email;
  UserRole role;

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

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!