前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《深入浅出Dart》Dart中使用JSON

《深入浅出Dart》Dart中使用JSON

作者头像
linwu
发布2023-07-27 16:16:30
4560
发布2023-07-27 16:16:30
举报
文章被收录于专栏:编程时光

现代JavaScript高级小册

深入浅出Dart

现代TypeScript高级小册

Dart中使用JSON

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,它基于JavaScript的一个子集。在Dart中,你可以使用dart:convert库来进行JSON的编码和解码。

9.1 JSON编码

你可以使用jsonEncode函数将一个Dart对象转换为JSON字符串。例如:

代码语言:javascript
复制
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字符串的对象。例如:

代码语言:javascript
复制
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"}
}

9.2 JSON解码

你可以使用jsonDecode函数将一个JSON字符串转换为Dart对象。例如:

代码语言:javascript
复制
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>类型的参数。例如:

代码语言:javascript
复制
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_serializable

在上一部分中,我们介绍了如何手动将JSON转换为Dart对象。然而,当你处理复杂的JSON数据时,手动转换可能会变得繁琐并且容易出错。因此,你可能会想使用代码生成库来自动完成这部分工作。在Dart中,有一种非常流行的库就是json_serializable

要使用json_serializable,你首先需要在pubspec.yaml文件中添加相关的依赖:

代码语言:javascript
复制
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命令来安装这些包。

接下来,你需要定义你的模型类,并使用一些注解:

代码语言:javascript
复制
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序列化代码:

代码语言:javascript
复制
flutter pub run build_runner build

生成的代码将会放在一个名为person.g.dart的文件中。

现在,你就可以使用fromJsontoJson方法来进行JSON和模型的转换了:

代码语言:javascript
复制
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 类 (通常被称为模型或数据类)

主要有以下原因:

  1. 类型安全:Dart 是一种强类型语言,这意味着当你定义了一个变量的类型,你就不能再将其他类型的值赋给这个变量。通过将 JSON 数据转换为 Dart 类,你可以获得编译时的类型检查,这可以帮助你找出可能的错误。例如,如果你尝试将一个字符串赋给一个整数类型的字段,编译器会给出错误。
  2. 代码可读性和可维护性:将 JSON 数据转换为 Dart 类可以使你的代码更加清晰和易于理解。你可以明确地知道你的数据结构,而不是在一个大的、结构不清的 Map 中查找数据。
  3. 易于操作:使用 Dart 类来处理 JSON 数据,你可以使用 Dart 的各种特性,例如方法、计算属性等。此外,许多 Dart 库和框架,例如 Flutter,需要使用 Dart 类来工作。
  4. 自动补全和文档:在 Dart 类中,你可以使用文档注释来说明每个字段的用途。而在 IDE 中,当你输入一个对象和一个点 (.) 时,IDE 就会显示出所有可用的字段和方法,这可以提高开发效率。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-07-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Dart中使用JSON
    • 9.1 JSON编码
      • 9.2 JSON解码
        • 使用json_serializable
          • 实践
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档