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