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 字符串。

相关推荐
BG10 小时前
Flutter 简仿Excel表格组件介绍
flutter
zhangmeng14 小时前
FlutterBoost在iOS26真机运行崩溃问题
flutter·app·swift
恋猫de小郭15 小时前
对于普通程序员来说 AI 是什么?AI 究竟用的是什么?
前端·flutter·ai编程
卡尔特斯15 小时前
Flutter A GlobalKey was used multipletimes inside one widget'schild list.The ...
flutter
w_y_fan18 小时前
Flutter 滚动组件总结
前端·flutter
醉过才知酒浓19 小时前
Flutter Getx 的页面传参
flutter
火柴就是我2 天前
flutter 之真手势冲突处理
android·flutter
Speed1232 天前
`mockito` 的核心“打桩”规则
flutter·dart
法的空间2 天前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
恋猫de小郭2 天前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter