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 教程。