Dart 语言 Dart 中的 JSON 序列化和反序列化如何实现

Dart阿木 发布于 2025-06-19 3 次阅读


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 处理功能。