JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于JavaScript的一个子集。在Dart中,你可以使用dart:convert
库来进行JSON的编码和解码。
你可以使用jsonEncode
函数将一个Dart对象
转换为JSON字符串。例如:
import 'dart:convert';
void main() {
var person = {
'name': 'John Doe',
'age': 30,
'city': 'New York'
};
var json = jsonEncode(person);
print(json); // 输出:{"name":"John Doe","age":30,"city":"New York"}
}
如果你需要将一个Dart类
转换为JSON字符串,那么你需要在对象中添加一个toJson
方法,这个方法应该返回一个可以直接转换为JSON字符串的对象。例如:
import 'dart:convert';
class Person {
String name;
int age;
String city;
Person(this.name, this.age, this.city);
Map<String, dynamic> toJson() => {
'name': name,
'age': age,
'city': city,
};
}
void main() {
var person = Person('John Doe', 30, 'New York');
var json = jsonEncode(person);
print(json); // 输出:{"name":"John Doe","age":30,"city":"New York"}
}
你可以使用jsonDecode
函数将一个JSON字符串转换为Dart对象。例如:
import 'dart:convert';
void main() {
var json = '{"name":"John Doe","age":30,"city":"New York"}';
var person = jsonDecode(json);
print(person); // 输出:{name: John Doe, age: 30, city: New York}
}
如果你需要将一个JSON字符串转换为Dart类
,那么你需要在对象中添加一个命名构造函数,例如fromJson
,这个构造函数应该接收一个Map<String, dynamic>
类型的参数。例如:
import 'dart:convert';
class Person {
String name;
int age;
String city;
Person(this.name, this.age, this.city);
Person.fromJson(Map<String, dynamic> json)
: name = json['name'],
age = json['age'],
city = json['city'];
}
void main() {
var json = '{"name":"John Doe","age":30,"city":"New York"}';
var person = Person.fromJson(jsonDecode(json));
print(person.name); // 输出:John Doe
}
在上一部分中,我们介绍了如何手动将JSON转换为Dart对象。然而,当你处理复杂的JSON数据时,手动转换可能会变得繁琐并且容易出错。因此,你可能会想使用代码生成库来自动完成这部分工作。在Dart中,有一种非常流行的库就是json_serializable
。
要使用json_serializable
,你首先需要在pubspec.yaml
文件中添加相关的依赖:
dependencies:
flutter:
sdk: flutter
json_annotation: ^4.0.0
dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.0.0
json_serializable: ^4.0.0
然后运行flutter pub get
命令来安装这些包。
接下来,你需要定义你的模型类,并使用一些注解:
import 'package:json_annotation/json_annotation.dart';
part 'person.g.dart';
@JsonSerializable()
class Person {
String name;
int age;
String city;
Person(this.name, this.age, this.city);
factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
Map<String, dynamic> toJson() => _$PersonToJson(this);
}
在这个例子中,_PersonFromJson和_PersonToJson是由json_serializable生成的辅助函数,它们将会在我们运行代码生成命令后自动生成。
现在,你可以运行以下命令来生成JSON序列化代码:
flutter pub run build_runner build
生成的代码将会放在一个名为person.g.dart
的文件中。
现在,你就可以使用fromJson
和toJson
方法来进行JSON和模型的转换了:
void main() {
var json = '{"name":"John Doe","age":30,"city":"New York"}';
var person = Person.fromJson(jsonDecode(json));
print(person.name); // 输出:John Doe
var json = jsonEncode(person.toJson());
print(json); // 输出:{"name":"John Doe","age":30,"city":"New York"}
}
json_serializable
提供了许多其他的功能,例如处理嵌套的模型、使用自定义的日期格式、处理枚举类型等。要了解更多信息,你可以查看其官方文档。
实际开发中,我们会将接口拿到的JSON数据转化为Dart 类 (通常被称为模型或数据类)
主要有以下原因: