Dart JSON
最后修改日期:2024 年 1 月 28 日
在本文中,我们将展示如何在 Dart 语言中使用 JSON。我们使用 dart:convert 库。
JSON
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。application/json 是 JSON 的官方 Internet 媒体类型。JSON 文件扩展名为 .json。
Dart 还拥有 JSON 生成库 package:json_serializable 和 package:built_value。在本文中,我们将重点介绍内置的 dart:convert 库。
对于每一个要转换为/从 JSON 转换的类,我们都定义了两个方法:fromJson 和 toJson。
fromJson 用于从映射结构构建新的对象实例。toJson 方法将类实例转换为映射。这些函数与 dart:convert 的 json.decode 和 json.encode 结合使用。
json.decode 函数解析 JSON 字符串并返回结果的 Json 对象(一个 Dart 映射)。json.encode 函数将对象转换为 JSON 字符串。
Dart JSON 简单示例
以下是一个处理 JSON 数据的简单 Dart 示例。
import 'dart:convert';
class User {
final String name;
final String occupation;
User(this.name, this.occupation);
User.fromJson(Map<String, dynamic> m)
: name = m['name'],
occupation = m['occupation'];
Map<String, dynamic> toJson() => {
'name': name,
'occupation': occupation,
};
@override
String toString() {
return "$name|$occupation";
}
}
void main() {
final u1Json = '{"name": "John Doe", "occupation": "gardener"}';
final u1 = User.fromJson(json.decode(u1Json));
print(u1);
final u2 = User('Roger Roe', 'gardener');
final u2Json = json.encode(u2);
print(u2Json);
}
在该程序中,我们将 JSON 字符串转换为 Dart 对象,反之亦然。
import 'dart:convert';
我们导入 dart:convert 库。
User.fromJson(Map<String, dynamic> m)
: name = m['name'],
occupation = m['occupation'];
这会从映射结构创建一个新的 User 实例。
Map<String, dynamic> toJson() => {
'name': name,
'occupation': occupation,
};
toJson 方法从对象实例创建一个映射结构。
final u1Json = '{"name": "John Doe", "occupation": "gardener"}';
我们定义一个 JSON 字符串。
final u1 = User.fromJson(json.decode(u1Json));
我们使用 json.decode 将字符串转换为映射,然后将其传递给 User.fromJson 方法,以从生成的映射创建 User 对象。
final u2 = User('Roger Roe', 'gardener');
final u2Json = json.encode(u2);
现在我们进行反向操作。我们定义一个 User 对象,并使用 json.encode 将其转换为 JSON 字符串。
$ dart main.dart
John Doe|gardener
{"name":"Roger Roe","occupation":"gardener"}
我们还有 jsonDecode 和 jsonEncode 简写函数,如果局部变量遮蔽了全局 json 常量,它们会很有用。
import 'dart:convert';
class User {
final String name;
final String occupation;
User(this.name, this.occupation);
User.fromJson(Map<String, dynamic> m)
: name = m['name'],
occupation = m['occupation'];
Map<String, dynamic> toJson() => {
'name': name,
'occupation': occupation,
};
@override
String toString() {
return "$name|$occupation";
}
}
void main() {
final u1Json = '{"name": "John Doe", "occupation": "gardener"}';
final u1 = User.fromJson(jsonDecode(u1Json));
print(u1);
final u2 = User('Roger Roe', 'gardener');
final u2Json = jsonEncode(u2);
print(u2Json);
}
在该程序中,我们使用 jsonDecode 和 jsonEncode 执行相同的转换。
Dart JSON 对象列表
在下一个示例中,我们将 JSON 对象列表转换为 JSON 字符串。
import 'dart:convert';
void main() {
final users = [
{'name': 'John Doe', 'occupation': 'gardener'},
{'name': 'Roger Roe', 'occupation': 'driver'},
{'name': 'Thomas Brown', 'occupation': 'teacher'}
];
final res = json.encode(users);
print(res);
}
我们有一个用户列表。每个用户由一个 Map<String, String> 定义。我们使用 json.encode 将列表转换为 JSON 字符串。
$ dart main.dart
[{"name":"John Doe","occupation":"gardener"},{"name":"Roger Roe","occupation":"driver"},
{"name":"Thomas Brown","occupation":"teacher"}]
Dart 对象列表
在下一个示例中,我们将处理 User 对象列表。
import 'dart:convert';
class User {
final String name;
final String occupation;
User(this.name, this.occupation);
User.fromJson(Map<String, dynamic> m)
: name = m['name'],
occupation = m['occupation'];
Map<String, dynamic> toJson() => {
'name': name,
'occupation': occupation,
};
@override
String toString() {
return "$name|$occupation";
}
}
void main() {
final users = <User>[
User("John Doe", "gardener"),
User("Roger Roe", "driver"),
User("Finn Bradley", "teacher")
];
String res = json.encode(users);
print(res);
print('----------------------------------');
List<dynamic> data = json.decode(res);
List<User> users2 =
List<User>.from(data.map<User>((dynamic e) => User.fromJson(e)));
print(users2);
}
我们将用户列表转换为 JSON 字符串,反之亦然。
final users = <User>[
User("John Doe", "gardener"),
User("Roger Roe", "driver"),
User("Finn Bradley", "teacher")
];
我们定义了一个用户对象列表。
String res = json.encode(users);
使用 json.encode 将列表编码为 JSON 字符串。
List<dynamic> data = json.decode(res);
我们将列表解码为列表。
List<User> users2 = List<User>.from(data.map<User>((dynamic e) => User.fromJson(e)));
该列表被转换为 User 实例列表。
$ dart main.dart
[{"name":"John Doe","occupation":"gardener"},{"name":"Roger Roe","occupation":"driver"},
{"name":"Finn Bradley","occupation":"teacher"}]
----------------------------------
[John Doe|gardener, Roger Roe|driver, Finn Bradley|teacher]
Dart 从 URL 获取 JSON 数据
在下一个示例中,我们将从 URL 资源获取 JSON 数据。
import 'dart:convert';
import 'package:http/http.dart' as http;
class User {
final int id;
final String firstName;
final String lastName;
final String email;
User(this.id, this.firstName, this.lastName, this.email);
User.fromJson(Map<String, dynamic> m)
: id = m['id'],
firstName = m['first_name'],
lastName = m['last_name'],
email = m['email'];
Map<String, dynamic> toJson() => {
'id': id,
'first_name': firstName,
'last_name': lastName,
'email': email,
};
@override
String toString() {
return "$id|$firstName|$lastName|$email";
}
}
void main() async {
final url = 'webcode.me';
final path = '/users.json';
final resp = await http.get(Uri.http(url, path));
List<dynamic> data = json.decode(resp.body)['users'];
List<User> users =
List<User>.from(data.map<User>((dynamic e) => User.fromJson(e)));
print(users);
print(users[0]);
print(json.encode(users[0]));
}
在示例中,我们向 Web 资源发起 GET 请求。该资源为 JSON 格式。
class User {
final int id;
final String firstName;
final String lastName;
final String email;
User(this.id, this.firstName, this.lastName, this.email);
User.fromJson(Map<String, dynamic> m)
: id = m['id'],
firstName = m['first_name'],
lastName = m['last_name'],
email = m['email'];
Map<String, dynamic> toJson() => {
'id': id,
'first_name': firstName,
'last_name': lastName,
'email': email,
};
@override
String toString() {
return "$id|$firstName|$lastName|$email";
}
}
我们有一个 User 类。JSON 资源具有以下字段:id、first_name、last_name 和 email。我们定义了 User.fromJson 和 toJson 方法。
final url = 'webcode.me'; final path = '/users.json'; final resp = await http.get(Uri.http(url, path));
我们向指定资源发起 GET 请求。
List<dynamic> data = json.decode(resp.body)['users'];
我们将 JSON 资源解码为列表。该资源是一个命名列表;因此,我们选择 users 字段。
List<User> users = List<User>.from(data.map<User>((dynamic e) => User.fromJson(e)));
该列表被转换为 User 对象列表。
$ dart main.dart
[1|Robert|Schwartz|rob23@gmail.com, 2|Lucy|Ballmer|lucyb56@gmail.com,
3|Anna|Smith|annasmith23@gmail.com, 4|Robert|Brown|bobbrown432@yahoo.com,
5|Roger|Bacon|rogerbacon12@yahoo.com]
1|Robert|Schwartz|rob23@gmail.com
{"id":1,"first_name":"Robert","last_name":"Schwartz","email":"rob23@gmail.com"}
来源
在本文中,我们处理了 Dart 中的 JSON 数据。我们使用了 dart:convert 库。
作者
列出 所有 Dart 教程。