ZetCode

Dart JSON

最后修改日期:2024 年 1 月 28 日

在本文中,我们将展示如何在 Dart 语言中使用 JSON。我们使用 dart:convert 库。

JSON

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。application/json 是 JSON 的官方 Internet 媒体类型。JSON 文件扩展名为 .json

Dart 还拥有 JSON 生成库 package:json_serializablepackage:built_value。在本文中,我们将重点介绍内置的 dart:convert 库。

对于每一个要转换为/从 JSON 转换的类,我们都定义了两个方法:fromJsontoJson

fromJson 用于从映射结构构建新的对象实例。toJson 方法将类实例转换为映射。这些函数与 dart:convertjson.decodejson.encode 结合使用。

json.decode 函数解析 JSON 字符串并返回结果的 Json 对象(一个 Dart 映射)。json.encode 函数将对象转换为 JSON 字符串。

Dart JSON 简单示例

以下是一个处理 JSON 数据的简单 Dart 示例。

main.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"}

我们还有 jsonDecodejsonEncode 简写函数,如果局部变量遮蔽了全局 json 常量,它们会很有用。

main.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(jsonDecode(u1Json));

  print(u1);

  final u2 = User('Roger Roe', 'gardener');
  final u2Json = jsonEncode(u2);

  print(u2Json);
}

在该程序中,我们使用 jsonDecodejsonEncode 执行相同的转换。

Dart JSON 对象列表

在下一个示例中,我们将 JSON 对象列表转换为 JSON 字符串。

main.dart
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 对象列表。

main.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 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 数据。

main.dart
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 资源具有以下字段:idfirst_namelast_nameemail。我们定义了 User.fromJsontoJson 方法。

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 中的 JSON 数据。我们使用了 dart:convert 库。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 Dart 教程