Flutter JSON序列化与反序列化插件json_class的使用

Flutter JSON序列化与反序列化插件 json_class 的使用

json_class 是一个用于简化 JSON 序列化和反序列化的 Flutter 插件。通过扩展该类,您可以轻松地将对象编码为 JSON 兼容的 Map 或 List,并且可以方便地从 JSON 兼容的 Map 或 List 解码回数据模型。

使用库

添加依赖

首先,在您的 pubspec.yaml 文件中添加 json_class 依赖:

dependencies:
  json_class: ^<version>  # 请替换 <version> 为您需要的版本号

然后运行以下命令以获取包:

flutter packages get

示例代码

下面是一个完整的示例,展示如何使用 json_class 进行 JSON 序列化和反序列化。

定义数据模型

我们定义一个 Person 类,继承自 JsonClass,并实现序列化和反序列化方法。

import 'package:json_class/json_class.dart';
import 'package:meta/meta.dart';

@immutable
class Person extends JsonClass {
  Person({
    this.age,
    this.minor,
    this.firstName,
    this.lastName,
  });

  final int age;
  final bool minor;
  final String firstName;
  final String lastName;

  // 从动态类型(如Map)创建Person实例
  static Person fromDynamic(dynamic map) {
    Person result;

    if (map != null) {
      result = Person(
        age: JsonClass.parseInt(map['age']),
        minor: JsonClass.parseBool(map['minor']),
        firstName: map['firstName'],
        lastName: map['lastName'],
      );
    }

    return result;
  }

  // 从动态类型的列表创建Person列表
  static List<Person> fromDynamicList(Iterable<dynamic> list) {
    List<Person> results;

    if (list != null) {
      results = [];
      for (dynamic map in list) {
        results.add(fromDynamic(map));
      }
    }

    return results;
  }

  // 将Person实例转换为JSON兼容的Map
  @override
  Map<String, dynamic> toJson() => JsonClass.removeNull({
    'age': age,
    'minor': minor,
    'firstName': firstName,
    'lastName': lastName,
  });
}

使用示例

接下来,我们将展示如何使用上述定义的 Person 类进行序列化和反序列化。

void main() {
  // 创建一个Person实例
  var person = Person(
    age: 30,
    minor: false,
    firstName: 'John',
    lastName: 'Doe'
  );

  // 将Person实例转换为JSON字符串
  var jsonString = person.toJson();
  print('Serialized JSON: $jsonString');

  // 将JSON字符串转换回Person实例
  var deserializedPerson = Person.fromDynamic(jsonString);
  print('Deserialized Person: ${deserializedPerson.firstName} ${deserializedPerson.lastName}, Age: ${deserializedPerson.age}');
  
  // 处理列表的情况
  var persons = [
    Person(age: 30, minor: false, firstName: 'John', lastName: 'Doe'),
    Person(age: 25, minor: false, firstName: 'Jane', lastName: 'Smith')
  ];

  // 将列表转换为JSON
  var jsonPersons = persons.map((person) => person.toJson()).toList();
  print('Serialized List of Persons: $jsonPersons');

  // 将JSON转换回列表
  var deserializedPersons = Person.fromDynamicList(jsonPersons);
  print('Deserialized List of Persons:');
  for (var p in deserializedPersons) {
    print('${p.firstName} ${p.lastName}, Age: ${p.age}');
  }
}

输出结果

运行上述代码后,您将看到类似以下输出:

Serialized JSON: {age: 30, minor: false, firstName: John, lastName: Doe}
Deserialized Person: John Doe, Age: 30
Serialized List of Persons: [{age: 30, minor: false, firstName: John, lastName: Doe}, {age: 25, minor: false, firstName: Jane, lastName: Smith}]
Deserialized List of Persons:
John Doe, Age: 30
Jane Smith, Age: 25

通过这种方式,您可以轻松地在 Flutter 应用中处理 JSON 数据的序列化和反序列化。希望这个示例对您有所帮助!


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

1 回复

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


在处理Flutter中的JSON序列化与反序列化时,json_class 插件并不是 Flutter 社区中广泛认知的标准库。通常,Flutter 开发者会使用 json_serializable 包来完成这项任务。不过,为了回答你的要求,这里我将展示如何使用 json_serializable 包来进行 JSON 的序列化和反序列化,这是当前推荐的方法。

首先,你需要添加 json_serializable 到你的 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.3.0  # 最新版本号可能会有所不同,请检查pub.dev获取最新

dev_dependencies:
  build_runner: ^2.1.4  # 最新版本号可能会有所不同,请检查pub.dev获取最新
  json_serializable: ^6.1.4  # 最新版本号可能会有所不同,请检查pub.dev获取最新

接下来,创建一个数据模型。例如,我们有一个简单的用户模型 User

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';  // 生成的代码将会放在这个文件里

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

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

  // 从 JSON 生成 User 对象
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  // 将 User 对象转换为 JSON
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

注意,@JsonSerializable() 注解告诉 json_serializable 包这个类需要生成序列化/反序列化的代码。part 'user.g.dart'; 指定了生成代码的文件名。

然后,运行以下命令来生成序列化代码:

flutter pub run build_runner build

这将会在你的项目目录中生成一个 user.g.dart 文件,里面包含了 _$UserFromJson_$UserToJson 方法的实现。

现在,你可以使用这些方法来序列化和反序列化 User 对象了:

void main() {
  // 创建一个 User 对象
  User user = User(name: 'Alice', age: 30);

  // 将 User 对象转换为 JSON
  Map<String, dynamic> userJson = user.toJson();
  print('User to JSON: $userJson');

  // 从 JSON 生成 User 对象
  User newUser = User.fromJson(userJson);
  print('JSON to User: ${newUser.name}, ${newUser.age}');
}

运行这段代码,你会看到 User 对象被成功序列化为 JSON,并且 JSON 又被成功反序列化为 User 对象。

如果你确实是在寻找一个名为 json_class 的特定插件,并且它不在 Flutter 的主流生态系统中,你可能需要查看该插件的官方文档或仓库来获取正确的使用方法。不过,基于当前的社区实践,json_serializable 是处理 Flutter 中 JSON 序列化与反序列化的推荐方式。

回到顶部