Dart 中的 JSON 序列化和反序列化实现详解
在 Dart 语言中,JSON(JavaScript Object Notation)序列化和反序列化是处理数据传输和存储的常见需求。JSON 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Dart 提供了内置的库来处理 JSON 数据,使得开发者可以轻松地将 Dart 对象转换为 JSON 字符串,以及将 JSON 字符串转换回 Dart 对象。
本文将详细介绍 Dart 中 JSON 序列化和反序列化的实现方法,包括使用内置的 `json` 库进行操作,以及如何自定义序列化和反序列化过程。
1. 使用内置 `json` 库进行序列化和反序列化
Dart 的 `json` 库提供了 `decode` 和 `encode` 方法,可以方便地进行 JSON 字符串与 Dart 对象之间的转换。
1.1 JSON 编码(序列化)
要将 Dart 对象转换为 JSON 字符串,可以使用 `json.encode` 方法。以下是一个简单的示例:
dart
void main() {
var person = {
'name': 'John Doe',
'age': 30,
'isMarried': false
};
String jsonString = json.encode(person);
print(jsonString);
}
输出结果为:
json
{"name":"John Doe","age":30,"isMarried":false}
1.2 JSON 解码(反序列化)
要将 JSON 字符串转换回 Dart 对象,可以使用 `json.decode` 方法。以下是一个示例:
dart
void main() {
String jsonString = '{"name":"Jane Doe","age":25,"isMarried":true}';
var person = json.decode(jsonString);
print(person['name']); // 输出: Jane Doe
}
2. 自定义序列化和反序列化
在某些情况下,你可能需要自定义序列化和反序列化的过程,以满足特定的需求。Dart 提供了 `JsonEncoder` 和 `JsonDecoder` 类,以及 `JsonSerializable` 注解,来帮助开发者实现自定义序列化和反序列化。
2.1 使用 `JsonSerializable` 注解
`JsonSerializable` 注解是 Dart 中最简单的方式来自定义序列化和反序列化过程。以下是一个使用 `JsonSerializable` 注解的示例:
dart
import 'package:json_annotation/json_annotation.dart';
part 'person.g.dart';
@JsonSerializable()
class Person {
String name;
int age;
bool isMarried;
Person(this.name, this.age, this.isMarried);
factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
Map<String, dynamic> toJson() => _$PersonToJson(this);
}
void main() {
var person = Person('John Doe', 30, false);
String jsonString = json.encode(person);
print(jsonString);
var decodedPerson = json.decode(jsonString);
var personFromJson = Person.fromJson(decodedPerson);
print(personFromJson.name); // 输出: John Doe
}
2.2 使用 `JsonEncoder` 和 `JsonDecoder`
如果你需要更细粒度的控制,可以使用 `JsonEncoder` 和 `JsonDecoder` 类。以下是一个示例:
dart
import 'dart:convert';
class Person {
String name;
int age;
bool isMarried;
Person(this.name, this.age, this.isMarried);
String toJson() {
final encoder = JsonEncoder.withIndent(' ');
return encoder.convert(this);
}
factory Person.fromJson(String jsonString) {
final decoder = JsonDecoder();
return decoder.convert(jsonString);
}
}
void main() {
var person = Person('John Doe', 30, false);
String jsonString = person.toJson();
print(jsonString);
var decodedPerson = Person.fromJson(jsonString);
print(decodedPerson.name); // 输出: John Doe
}
3. 总结
在 Dart 中,JSON 序列化和反序列化是处理数据传输和存储的重要功能。使用内置的 `json` 库可以方便地进行基本操作,而通过自定义序列化和反序列化,可以满足更复杂的业务需求。本文介绍了 Dart 中 JSON 序列化和反序列化的实现方法,包括使用 `json` 库、`JsonSerializable` 注解以及 `JsonEncoder` 和 `JsonDecoder` 类。希望这些内容能够帮助开发者更好地理解和应用 Dart 中的 JSON 处理功能。
Comments NOTHING