Flutter序列化插件dartx_serialization的使用

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

Flutter序列化插件dartx_serialization的使用

简介

dartx_serialization 是一个用于将对象序列化为 JSON 字符串或将 JSON 字符串反序列化为对象的包。它通过反射机制实现,支持多种类型,包括枚举、日期时间等。


特性

  • 易于使用
  • 支持枚举值。
  • 支持日期时间对象。
  • 支持序列化任何值并反序列化为目标类值(通过 @ValueConvertor 注解)。

开始使用

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  dartx_serialization: ^1.0.0

然后运行 flutter pub get


使用方法

1. 标记可序列化的类

使用 @Serializable 注解标记要序列化的类。

import 'package:dartx_serialization/dartx_serialization.dart';

@Serializable()
class Person {}

2. 获取序列化实例

获取 DartXJson 类的实例。

import 'package:dartx_serialization/dartx_serialization.dart';

final jsonSerialization = DartXJson.instance;

3. 序列化对象

使用 toJson() 方法将对象序列化为 JSON 字符串。

import 'package:dartx_serialization/dartx_serialization.dart';

final jsonSerialization = DartXJson.instance;
final person = Person(name: 'name', age: 24);
final personJsonStr = jsonSerialization.toJson(person);

print(personJsonStr);

4. 反序列化对象

使用 fromJson<T>() 方法将 JSON 字符串反序列化为目标类对象。

import 'package:dartx_serialization/dartx_serialization.dart';

final jsonString = '{"name":"person name", "age":24}';
final jsonSerialization = DartXJson.instance;

final person = jsonSerialization.fromJson<Person>(jsonString);

高级用法

1. 自定义 JSON 键

默认情况下,JSON 键是类字段的名称。可以通过 @JsonKey 注解设置自定义 JSON 键。

class Person {
  @JsonKey('p_name')
  final String name;
}

2. 忽略某些字段

通过 @Ignore 注解忽略某些字段。

class Person {
  final String name;
  final int age;
  @Ignore()
  final bool registered;

  Person(this.name, this.age, [this.registered = false]);
}

注意:必须为被忽略的字段提供默认值,否则会抛出 NoMatchConstructorError

3. 序列化/反序列化不支持的类型

默认支持的类型包括基本类型、列表、映射、可序列化对象、枚举和日期时间。对于其他类型,可以使用 @ValueConvertor 注解。

class Person {
  final String name;
  final int age;
  @ValueConvertor<int, Duration>(
    convertor: _convert,
    deconvertor: _deconvert,
  )
  final Duration birthday;

  static int _convert(Duration d) => d.inMilliseconds;
  static Duration _deconvert(int millis) => Duration(milliseconds: millis);
}

4. 反序列化列表类型

默认情况下,JSON 数组元素会被反序列化为 List<dynamic>。如果类中有非动态类型的列表字段,则需要显式指定列表类型。

@Serializable()
class Person {
  @ListType<double>()
  List<double> grades;
}

示例代码

以下是一个完整的示例代码,展示如何使用 dartx_serialization 包。

import 'package:dartx_serialization/dartx_serialization.dart';
import 'model.dart'; // 假设 model.dart 中定义了 Person 类

void main(List<String> args) {
  // 创建一个 Person 对象
  final person = Person(
      'Person name',
      24,
      Gender.male,
      Address('Khartoum', 2, Duration(hours: 2)),
      [3.30, 3.20, 3.00],
      [Course('Math'), Course('CS')],
      DateTime(1999),
      {"map_item1": "item one"},
      [
        {
          "list_map_item1": "1",
          "list_map_item2": "2",
        }
      ]);

  // 获取序列化实例并序列化对象
  final jsonSerialization = DartXJson.instance;
  final jsonStr = jsonSerialization.toJson(person);

  print('Json string: $jsonStr\n\n');

  // 反序列化 JSON 字符串为 Person 对象
  final deserializedPerson =
      jsonSerialization.fromJson<Person>(validJsonStringOfPerson);
  print('Person object: $deserializedPerson');
}

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

1 回复

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


dartx_serialization 是一个用于 Flutter 和 Dart 的序列化插件,它可以帮助你将 Dart 对象转换为 JSON 或其他格式,并且可以将 JSON 或其他格式的数据反序列化为 Dart 对象。以下是如何使用 dartx_serialization 的基本步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dartx_serialization: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 创建模型类

接下来,你需要创建一个 Dart 类,并使用 dartx_serialization 的注解来标记需要序列化的字段。

import 'package:dartx_serialization/dartx_serialization.dart';

[@Serializable](/user/Serializable)()
class User {
  [@SerializeField](/user/SerializeField)()
  String name;

  [@SerializeField](/user/SerializeField)()
  int age;

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

3. 序列化和反序列化

使用 dartx_serialization 进行序列化和反序列化非常简单。你可以使用 Serialization 类来完成这些操作。

序列化

将 Dart 对象转换为 JSON 字符串:

import 'package:dartx_serialization/dartx_serialization.dart';

void main() {
  var user = User(name: 'John Doe', age: 30);
  var serialization = Serialization();
  var jsonString = serialization.serialize(user);
  print(jsonString);  // 输出: {"name":"John Doe","age":30}
}

反序列化

将 JSON 字符串转换为 Dart 对象:

import 'package:dartx_serialization/dartx_serialization.dart';

void main() {
  var jsonString = '{"name":"John Doe","age":30}';
  var serialization = Serialization();
  var user = serialization.deserialize<User>(jsonString);
  print(user.name);  // 输出: John Doe
  print(user.age);   // 输出: 30
}

4. 处理嵌套对象

如果你的模型类中包含了其他对象,dartx_serialization 也可以自动处理嵌套对象的序列化和反序列化。

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

  [@SerializeField](/user/SerializeField)()
  String zipCode;

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

[@Serializable](/user/Serializable)()
class User {
  [@SerializeField](/user/SerializeField)()
  String name;

  [@SerializeField](/user/SerializeField)()
  int age;

  [@SerializeField](/user/SerializeField)()
  Address address;

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

void main() {
  var user = User(
    name: 'John Doe',
    age: 30,
    address: Address(city: 'New York', zipCode: '10001'),
  );

  var serialization = Serialization();
  var jsonString = serialization.serialize(user);
  print(jsonString);  // 输出: {"name":"John Doe","age":30,"address":{"city":"New York","zipCode":"10001"}}

  var deserializedUser = serialization.deserialize<User>(jsonString);
  print(deserializedUser.address.city);  // 输出: New York
}

5. 自定义序列化和反序列化

如果你需要对某些字段进行自定义的序列化或反序列化,你可以使用 @Serialize@Deserialize 注解。

[@Serializable](/user/Serializable)()
class User {
  [@SerializeField](/user/SerializeField)()
  String name;

  [@SerializeField](/user/SerializeField)()
  int age;

  [@SerializeField](/user/SerializeField)()
  @Serialize(using: CustomDateSerializer())
  DateTime createdAt;

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

class CustomDateSerializer implements Serializer<DateTime> {
  @override
  dynamic serialize(DateTime value) {
    return value.toIso8601String();
  }

  @override
  DateTime deserialize(dynamic value) {
    return DateTime.parse(value);
  }
}

void main() {
  var user = User(
    name: 'John Doe',
    age: 30,
    createdAt: DateTime.now(),
  );

  var serialization = Serialization();
  var jsonString = serialization.serialize(user);
  print(jsonString);  // 输出: {"name":"John Doe","age":30,"createdAt":"2023-10-01T12:34:56.789Z"}

  var deserializedUser = serialization.deserialize<User>(jsonString);
  print(deserializedUser.createdAt);  // 输出: 2023-10-01 12:34:56.789
}

6. 处理集合

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

[@Serializable](/user/Serializable)()
class User {
  [@SerializeField](/user/SerializeField)()
  String name;

  [@SerializeField](/user/SerializeField)()
  List<String> hobbies;

  [@SerializeField](/user/SerializeField)()
  Map<String, dynamic> metadata;

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

void main() {
  var user = User(
    name: 'John Doe',
    hobbies: ['Reading', 'Swimming'],
    metadata: {'key1': 'value1', 'key2': 123},
  );

  var serialization = Serialization();
  var jsonString = serialization.serialize(user);
  print(jsonString);  // 输出: {"name":"John Doe","hobbies":["Reading","Swimming"],"metadata":{"key1":"value1","key2":123}}

  var deserializedUser = serialization.deserialize<User>(jsonString);
  print(deserializedUser.hobbies);  // 输出: [Reading, Swimming]
  print(deserializedUser.metadata); // 输出: {key1: value1, key2: 123}
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!