Dart中的Converter

在Dart中,Converterdart:convert库中定义的一个抽象类,用于表示可以将一种数据转换为另一种数据的通用转换器。它是处理数据转换任务的基础,尤其是在序列化(如将对象转换为JSON字符串)和反序列化(如将JSON字符串转换回对象)时非常有用。Converter类定义了两个主要的方法:convertfuse

convert方法

convert方法是Converter的核心方法,用于执行数据转换。它接受一个输入参数,返回转换后的结果。convert方法的具体实现依赖于Converter的子类,这些子类定义了如何将输入的数据类型转换为输出的数据类型。

Dart 复制代码
TOutput convert(TInput input)
  • TInputconvert方法的输入类型。
  • TOutput:转换操作完成后的输出类型。

fuse方法

fuse方法允许你将两个Converter对象连接起来,创建一个新的Converter实例,这个新实例首先应用当前的转换器,然后应用作为参数传递给fuse方法的另一个转换器。

Dart 复制代码
Converter<TInput, TOutput> fuse<TOutput>(Converter<TIntermediate, TOutput> other)
  • TIntermediate:中间类型,即当前Converter的输出类型,也是作为参数传递给fuse方法的Converter的输入类型。
  • TOutput:最终的输出类型,即通过fuse方法组合的两个转换器的最终输出类型。

示例

假设我们有一个简单的模型类User,我们想要将其序列化为JSON字符串,再从JSON字符串反序列化回User对象。我们可以定义两个Converter:一个用于序列化(UserToJsonConverter),另一个用于反序列化(JsonToUserConverter)。

Dart 复制代码
import 'dart:convert';

class User {
  final String name;
  final int age;

  User(this.name, this.age);

  // 将User对象转换为Map,便于序列化
  Map<String, dynamic> toJson() => {
    'name': name,
    'age': age,
  };

  // 从Map构造User对象
  static User fromJson(Map<String, dynamic> json) => User(
    json['name'] as String,
    json['age'] as int,
  );
}

// User到JSON字符串的转换器
class UserToJsonConverter extends Converter<User, String> {
  @override
  String convert(User input) => jsonEncode(input.toJson());
}

// JSON字符串到User对象的转换器
class JsonToUserConverter extends Converter<String, User> {
  @override
  User convert(String input) => User.fromJson(jsonDecode(input));
}

void main() {
  var user = User('Alice', 30);
  var userToJson = UserToJsonConverter();
  var jsonToUser = JsonToUserConverter();

  // 序列化User对象
  var jsonString = userToJson.convert(user);
  print(jsonString); // 输出JSON字符串

  // 反序列化JSON字符串
  var userFromJson = jsonToUser.convert(jsonString);
  print('${userFromJson.name}, ${userFromJson.age}'); // 输出User对象的属性
}

通过定义和使用Converter,我们可以清晰地管理和组织数据的转换逻辑,使代码更加模块化和可复用。在处理序列化和反序列化任务时,Converter提供了一种灵活且强大的方法。

jsonEncode

jsonEncode 是 Dart 中 dart:convert 库提供的一个函数,用于将 Dart 对象转换(序列化)成 JSON 字符串。这个函数是 json.encode 函数的简便方式,它背后调用的是 JsonEncoder 的实例。jsonEncode 主要用于处理那些可以转换为有效 JSON 的 Dart 对象,比如 MapListStringnum(包括 intdouble)以及 bool

使用方式

jsonEncode 函数接受一个参数 ------ 需要被序列化的 Dart 对象。它返回一个表示这个对象的 JSON 字符串。如果对象包含无法转换为 JSON 形式的数据(例如,包含循环引用或不支持的类型),jsonEncode 将抛出一个异常。

Dart 复制代码
import 'dart:convert';

void main() {
  var data = {
    'name': 'John Doe',
    'age': 30,
    'email': 'johndoe@example.com',
    'isSubscribed': true
  };

  String jsonStr = jsonEncode(data);
  print(jsonStr);
}

在这个例子中,我们有一个 Dart 的 Map 对象 data,其中包含了一些键值对。使用 jsonEncode 函数,我们将这个 Map 转换成了一个 JSON 字符串。输出将是:

Json 复制代码
{"name":"John Doe","age":30,"email":"johndoe@example.com","isSubscribed":true}

注意事项

  • jsonEncode 只能序列化那些可以表示为 JSON 的数据类型。对于 Dart 中的自定义对象,你需要将它们转换成 Map 或其他支持的类型。
  • 如果需要将自定义对象序列化为 JSON 字符串,通常需要在这些对象中实现一个 toJson方法,该方法返回一个 Map,然后使用 jsonEncode 对这个 Map 进行序列化。
  • 在反序列化 JSON 字符串(即将 JSON 字符串转换回 Dart 对象)时,可以使用 jsonDecode 函数,它是 json.decode 函数的简便方式。

自定义对象的序列化示例

假设我们有一个自定义的 Dart 类 User,我们希望将其实例序列化为 JSON 字符串:

Dart 复制代码
class User {
  final String name;
  final int age;
  final String email;

  User(this.name, this.age, this.email);

  // 将 User 对象转换为 Map
  Map<String, dynamic> toJson() => {
    'name': name,
    'age': age,
    'email': email,
  };
}

void main() {
  var user = User('John Doe', 30, 'johndoe@example.com');
  String jsonStr = jsonEncode(user.toJson());
  print(jsonStr);
}

在这个例子中,我们首先定义了 toJson 方法来将 User 对象转换成 Map。然后,我们可以使用 jsonEncode 对这个 Map 进行序列化,从而得到代表 User 对象的 JSON 字符串。

相关推荐
早起的年轻人9 小时前
Flutter String 按 ,。分割
flutter
helloxmg19 小时前
鸿蒙harmonyos next flutter通信之MethodChannel获取设备信息
flutter
helloxmg19 小时前
鸿蒙harmonyos next flutter混合开发之开发package
flutter·华为·harmonyos
lqj_本人2 天前
flutter_鸿蒙next_Dart基础②List
flutter
lqj_本人2 天前
flutter_鸿蒙next_Dart基础①字符串
flutter
The_tuber_sadness2 天前
【Flutter】- 基础语法
flutter
helloxmg2 天前
鸿蒙harmonyos next flutter通信之BasicMessageChannel获取app版本号
flutter
linpengteng3 天前
使用 Flutter 开发数字钱包应用(Dompet App)
前端·flutter·firebase