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

相关推荐
p1gd0g2 分钟前
flutter web 如何确保用户收到更新
flutter
GoCoding18 分钟前
Flutter ngspice 插件
flutter
恋猫de小郭21 分钟前
Android Studio Panda 2 ,支持 AI 用 Vibe Coding 创建项目
android·前端·flutter
Gorit2 小时前
如何使用 Flutter 开发 HarmonyOS 应用
flutter·华为·harmonyos
孤影过客2 小时前
Flutter高性能任务管理APP开发实战代码解析
jvm·flutter·oracle
键盘鼓手苏苏15 小时前
Flutter 三方库 p2plib 的鸿蒙化适配指南 - 实现高性能的端到端(P2P)加密通讯、支持分布式节点发现与去中心化数据流传输实战
flutter·harmonyos·鸿蒙·openharmony
加农炮手Jinx15 小时前
Flutter for OpenHarmony:postgrest 直接访问 PostgreSQL 数据库的 RESTful 客户端(Supabase 核心驱动) 深度解析与鸿蒙适配指南
数据库·flutter·华为·postgresql·restful·harmonyos·鸿蒙
加农炮手Jinx15 小时前
Flutter 组件 heart 适配鸿蒙 HarmonyOS 实战:分布式心跳监控,构建全场景保活检测与链路哨兵架构
flutter·harmonyos·鸿蒙·openharmony
钛态15 小时前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos
王码码203515 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos