Flutter JSON序列化与反序列化插件json_serializable_generic的使用
Flutter JSON序列化与反序列化插件json_serializable_generic的使用
本包提供了一种JSON序列化的机制。你可以将这种行为添加到任何你喜欢的类中。
开始使用
首先,你需要创建一个新的类或使用现有的类,然后添加JsonSerializable混入,如以下代码所示:
class User with JsonSerializable {
  final int id;
  final String name;
  final int age;
  User({required this.id, required this.name, required this.age});
}
注意:确保你的构造函数使用命名参数。
在添加了JsonSerializable后,你的类将会新增以下方法:
- toMap- 如果你想将当前实例转换为Map结构,可以使用此方法。
- toJson- 如果你想将当前实例转换为JSON编码的数据,可以使用此方法。
- fromMap- 如果你想将一个Map结构转换为类实例,可以使用此方法。
- fromJson- 如果你想将一个JSON编码的数据转换为类实例,可以使用此方法。
要导入json_serializable包:
import 'package:json_serializable/json_serializable.dart';
完整示例
下面是一个完整的示例,展示了如何使用json_serializable进行序列化和反序列化:
import 'package:json_serializable/json_serializable.dart';
import 'models/user_model.dart'; // 假设你已经定义了一个UserModel类
void exampleWithMap() {
  var commonUser = User(id: 1, name: 'Dash', age: 10);
  print(commonUser.toMap()); // 输出当前用户对象的Map表示
  var parsedUser = JsonSerializable.fromMap<User>(commonUser.toMap());
  print(parsedUser.toMap()); // 输出解析后的用户对象的Map表示
}
void exampleWithJson() {
  var commonUser = User(id: 1, name: 'Dash', age: 10);
  print(commonUser.toJson()); // 输出当前用户对象的JSON字符串
  var parsedUser = JsonSerializable.fromJson<User>(commonUser.toJson());
  print(parsedUser.toJson()); // 输出解析后的用户对象的JSON字符串
}
void main() {
  try {
    exampleWithMap();
    exampleWithJson();
  } catch (e) {
    print(e); // 捕获并打印任何可能发生的异常
  }
}
额外功能
现在,你可以在toMap和fromMap方法中使用可选参数,如果你想在将类转换为Map时排除某些变量,可以通过传递一个List<String>来实现。同样的想法也可以用于从Map数据创建类实例时排除某些字段。
使用toMap方法排除键值
var user = User(id: 1, name: 'Dash', age: 10);
print(user.toMap(excludes: ['id'])); // 输出不包含'id'的Map
// {name: Dash, age: 10}
使用fromMap方法排除键值
var mapUser = {
  "id": 2,
  "name": "foo",
  "lastName": "bar",
  "age": 11,
};
var user = 
  JsonSerializable.fromMap<User>(mapUser, excludes: ['lastName']);
print(user.toMap()); // 输出不包含'lastName'的Map
// {id: 2, name: foo, age: 11}
更多关于Flutter JSON序列化与反序列化插件json_serializable_generic的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter JSON序列化与反序列化插件json_serializable_generic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,json_serializable 是一个常用的库,用于自动化生成JSON序列化与反序列化的代码。json_serializable_generic 是一个扩展库,它支持泛型类型的序列化与反序列化。下面是使用 json_serializable_generic 的步骤:
1. 添加依赖
首先,在 pubspec.yaml 文件中添加以下依赖:
dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^4.8.1
dev_dependencies:
  build_runner: ^2.3.3
  json_serializable: ^6.6.1
  json_serializable_generic: ^0.3.0
2. 创建模型类
接下来,创建一个模型类,并使用 @JsonSerializableGeneric 注解来支持泛型类型。
import 'package:json_annotation/json_annotation.dart';
import 'package:json_serializable_generic/json_serializable_generic.dart';
part 'example_model.g.dart';
@JsonSerializableGeneric()
class ExampleModel<T> {
  final T data;
  final String message;
  ExampleModel({required this.data, required this.message});
  factory ExampleModel.fromJson(Map<String, dynamic> json) => _$ExampleModelFromJson<T>(json);
  Map<String, dynamic> toJson() => _$ExampleModelToJson<T>(this);
}
3. 生成序列化代码
运行 build_runner 生成序列化代码:
flutter pub run build_runner build
这将会生成 example_model.g.dart 文件,其中包含 _$ExampleModelFromJson 和 _$ExampleModelToJson 方法的实现。
4. 使用模型类
现在你可以使用这个模型类来进行JSON的序列化与反序列化。
void main() {
  // 反序列化
  final jsonString = '{"data": 42, "message": "Hello"}';
  final jsonMap = jsonDecode(jsonString);
  final exampleModel = ExampleModel<int>.fromJson(jsonMap);
  print(exampleModel.message); // 输出: Hello
  print(exampleModel.data);    // 输出: 42
  // 序列化
  final newExampleModel = ExampleModel<int>(data: 100, message: 'World');
  final newJsonMap = newExampleModel.toJson();
  final newJsonString = jsonEncode(newJsonMap);
  print(newJsonString); // 输出: {"data":100,"message":"World"}
}
5. 处理复杂泛型类型
如果你需要在模型类中使用更复杂的泛型类型,比如 List<T> 或 Map<String, T>,json_serializable_generic 也可以处理。
@JsonSerializableGeneric()
class ComplexModel<T> {
  final List<T> items;
  final Map<String, T> metadata;
  ComplexModel({required this.items, required this.metadata});
  factory ComplexModel.fromJson(Map<String, dynamic> json) => _$ComplexModelFromJson<T>(json);
  Map<String, dynamic> toJson() => _$ComplexModelToJson<T>(this);
}
6. 运行 build_runner 并测试
再次运行 build_runner 生成代码,并测试复杂泛型类型的序列化与反序列化。
flutter pub run build_runner build 
        
       
             
             
            

