Dart中的Converter
在Dart中,Converter
是dart:convert
库中定义的一个抽象类,用于表示可以将一种数据转换为另一种数据的通用转换器。它是处理数据转换任务的基础,尤其是在序列化(如将对象转换为JSON字符串)和反序列化(如将JSON字符串转换回对象)时非常有用。Converter
类定义了两个主要的方法:convert
和fuse
。
convert
方法
convert
方法是Converter
的核心方法,用于执行数据转换。它接受一个输入参数,返回转换后的结果。convert
方法的具体实现依赖于Converter
的子类,这些子类定义了如何将输入的数据类型转换为输出的数据类型。
TOutput convert(TInput input)
TInput
:convert
方法的输入类型。TOutput
:转换操作完成后的输出类型。
fuse
方法
fuse
方法允许你将两个Converter
对象连接起来,创建一个新的Converter
实例,这个新实例首先应用当前的转换器,然后应用作为参数传递给fuse
方法的另一个转换器。
Converter<TInput, TOutput> fuse<TOutput>(Converter<TIntermediate, TOutput> other)
TIntermediate
:中间类型,即当前Converter
的输出类型,也是作为参数传递给fuse
方法的Converter
的输入类型。TOutput
:最终的输出类型,即通过fuse
方法组合的两个转换器的最终输出类型。
示例
假设我们有一个简单的模型类User
,我们想要将其序列化为JSON字符串,再从JSON字符串反序列化回User
对象。我们可以定义两个Converter
:一个用于序列化(UserToJsonConverter
),另一个用于反序列化(JsonToUserConverter
)。
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 对象,比如 Map
、List
、String
、num
(包括 int
和 double
)以及 bool
。
使用方式
jsonEncode
函数接受一个参数 —— 需要被序列化的 Dart 对象。它返回一个表示这个对象的 JSON 字符串。如果对象包含无法转换为 JSON 形式的数据(例如,包含循环引用或不支持的类型),jsonEncode
将抛出一个异常。
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 字符串。输出将是:
{"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 字符串:
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 字符串。
转载自:https://juejin.cn/post/7359461815394025499