Flutter JSON序列化辅助插件json_serializable_helper的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter JSON序列化辅助插件json_serializable_helper的使用

通过将此包添加到您的项目中,您可以直接使用 JSON 文件作为 json_serializable 包的输入。

功能

假设您已经从 API 调用中收到了以下响应:

{
  "name": "John Doe",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "country": "USA"
  },
  "job": {
    "title": "Software Engineer",
    "company": {
      "name": "TechCorp",
      "industry": "Technology"
    }
  }
}

如果您想解码和编码这个简单的 JSON,您可以使用 json_serializable 包。但在那之前,您需要创建一个由 json_serializable 所需的相应 person.dart 类:

import 'package:json_annotation/json_annotation.dart';

part 'person.g.dart';

@JsonSerializable()
class Person {
  @JsonKey(name: 'name', defaultValue: null)
  final String? name;

  @JsonKey(name: 'age', defaultValue: null)
  final int? age;

  @JsonKey(name: 'address', defaultValue: null)
  final Address? address;

  @JsonKey(name: 'job', defaultValue: null)
  final Job? job;

  Person({
    this.name,
    this.age,
    this.address,
    this.job,
  });

  factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
  Map<String, dynamic> toJson() => _$PersonToJson(this);
}

@JsonSerializable()
class Address {
  @JsonKey(name: 'street', defaultValue: null)
  final String? street;

  @JsonKey(name: 'city', defaultValue: null)
  final String? city;

  @JsonKey(name: 'country', defaultValue: null)
  final String? country;

  Address({
    this.street,
    this.city,
    this.country,
  });

  factory Address.fromJson(Map<String, dynamic> json) => _$AddressFromJson(json);
  Map<String, dynamic> toJson() => _$AddressToJson(this);
}

@JsonSerializable()
class Job {
  @JsonKey(name: 'title', defaultValue: null)
  final String? title;

  @JsonKey(name: 'company', defaultValue: null)
  final Company? company;

  Job({
    this.title,
    this.company,
  });

  factory Job.fromJson(Map<String, dynamic> json) => _$JobFromJson(json);
  Map<String, dynamic> toJson() => _$JobToJson(this);
}

@JsonSerializable()
class Company {
  @JsonKey(name: 'name', defaultValue: null)
  final String? name;

  @JsonKey(name: 'industry', defaultValue: null)
  final String? industry;

  Company({
    this.name,
    this.industry,
  });

  factory Company.fromJson(Map<String, dynamic> json) => _$CompanyFromJson(json);
  Map<String, dynamic> toJson() => _$CompanyToJson(this);
}

然后运行以下命令:

dart run build_runner build --delete-conflicting-outputs

这将会为您生成 person.g.dart 文件,您就完成了!

正如您所见,编写 person.dart 类是一个繁琐且容易出错的过程,特别是当 JSON 较大且复杂时。该包旨在简化这一过程,通过允许您使用 JSON 文件作为 json_serializable 的输入。这意味着您只需在项目中包含 JSON 文件,然后运行上述相同的命令,相应的 Dart 类(如 person.dartperson.g.dart)就会为您自动生成。

使用方法

pubspec.yaml 文件中添加 json_serializablejson_serializable_helper 依赖项:

dev_dependencies:
  json_serializable: ^6.7.1
  json_serializable_helper: ^1.0.0

然后在项目的根目录下添加一个 build.yaml 文件。在这个文件中,您应该指定 JSON 文件所在的目录,例如:

global_options:
  json_serializable_helper:
    options:
      json_path: "lib/datamodels"

在上面的例子中,您的 JSON 文件可以放在 lib/datamodels 目录或其任何子目录下,例如 lib/datamodels/aws/person.json

现在运行以下命令以生成 Dart 类:

dart run build_runner build --delete-conflicting-outputs

更多关于Flutter JSON序列化辅助插件json_serializable_helper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON序列化辅助插件json_serializable_helper的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用json_serializable_helper插件来进行JSON序列化和反序列化的示例。需要注意的是,json_serializable_helper并不是一个广泛认知的官方或流行的Flutter插件,通常我们使用json_annotationbuild_runner来进行JSON序列化和反序列化。不过,为了回答你的问题,我们假设json_serializable_helper提供了一个类似的功能,并且你可能需要类似以下步骤来集成和使用它。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加json_serializable_helper的依赖(如果它真的存在的话;这里假设它是可用的):

dependencies:
  flutter:
    sdk: flutter
  json_serializable_helper: ^x.y.z  # 替换为实际版本号

然后运行flutter pub get来安装依赖。

2. 创建数据模型

假设我们有一个简单的用户数据模型User,我们可以使用json_serializable_helper(或者类似的注解方式)来标记这个类,以便它可以被序列化和反序列化。

import 'package:json_serializable_helper/json_serializable_helper.dart';  // 假设这是正确的导入路径

@JsonSerializable()
class User {
  String name;
  int age;
  String email;

  User({required this.name, required this.age, required this.email});

  // 生成的fromJson和toJson方法
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

注意:在实际使用中,_$UserFromJson_$UserToJson方法是由json_serializable插件生成的,而不是手动编写的。如果json_serializable_helper有类似的机制,它应该也会生成这些方法。

3. 生成代码

通常,你需要使用build_runner来生成序列化和反序列化代码。对于json_serializable_helper(如果它遵循类似json_serializable的约定),你可能也需要运行类似的命令:

flutter pub run build_runner build

请注意,这个命令假设json_serializable_helper依赖于build_runner来生成代码。如果它使用不同的工具或机制,你需要根据它的文档来运行相应的命令。

4. 使用序列化和反序列化

一旦代码生成完成,你就可以在代码中使用fromJsontoJson方法来序列化和反序列化User对象了。

void main() {
  // 创建一个User对象
  User user = User(name: 'John Doe', age: 30, email: 'john.doe@example.com');

  // 将User对象序列化为JSON
  Map<String, dynamic> userJson = user.toJson();
  print(userJson);

  // 从JSON反序列化为User对象
  String jsonString = '{"name": "Jane Doe", "age": 25, "email": "jane.doe@example.com"}';
  Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  User newUser = User.fromJson(jsonMap);
  print(newUser.name);  // 输出: Jane Doe
}

注意事项

  • 如果json_serializable_helper不是实际存在的插件,你可能需要使用json_annotationbuild_runner,它们是Flutter社区广泛使用的标准解决方案。
  • 确保你按照插件的文档正确安装和配置它。
  • 如果json_serializable_helper有特定的配置要求或额外的步骤,请查阅其官方文档。

希望这个示例能帮助你理解如何在Flutter项目中使用JSON序列化和反序列化插件。如果有任何问题或需要进一步的帮助,请随时提问。

回到顶部