Flutter JSON反射处理插件json_reflectable的使用
Flutter JSON反射处理插件json_reflectable
的使用
特性
这个包允许程序员为Dart对象添加注解,以反射调用fromJson
和toJson
方法。
开始使用
-
在您的
pubspec.yaml
文件中添加以下依赖项:dependencies: json_reflectable: ^1.0.0
-
或者在终端中运行以下命令:
flutter pub add json_reflectable
使用方法
-
在您的
main.dart
文件中添加以下代码:import 'main.reflectable.dart'; void main() { initializeReflectable(); // 初始化反射功能 //... }
-
为需要反射的类添加
@jsonReflector
注解:@jsonReflector @JsonSerializable() // 这个注解来自json_serializable包 class TextEntity { double float; String string; TextEntity(this.float, this.string); // 自动生成的fromJson方法 factory TextEntity.fromJson(Map<String, dynamic> json) => _$TextEntityEntityFromJson(json); // 自动生成的toJson方法 Map<String, dynamic> toJson() => _$TextEntityEntityToJson(this); }
-
使用实例镜像:
final testJson = jsonDecode(''' { "float": 1.0, "string": "str" } '''); TextEntity instance = TextEntity.fromJson(testJson); print(jsonReflector.toJson(instance)); // 将实例转换为JSON字符串
-
使用类镜像:
TextEntity instance = jsonReflector.formJson<TextEntity>(testJson); // 从JSON创建实例 print(instance.toJson()); // 将实例转换为JSON字符串
-
使用可迭代对象:
final iterable = Iterable.generate(3, (index) => jsonMap); final list = jsonReflector.formIterable<Text01Entity>(iterable).toList(); print("list ${list.runtimeType}"); print(jsonEncode(list)); // 将列表转换为JSON字符串
完整示例Demo
import 'dart:convert';
import 'package:json_reflectable/json_reflectable.dart';
// 假设我们有一个实体类
@JsonSerializable()
class Text01Entity {
int? int8;
int? int_16;
int? int_32;
double? float;
bool? boolean;
String? string;
Map<String, dynamic>? obj;
Map<String, dynamic>? empty_obj;
List<dynamic>? empty_array;
List<String>? str_array;
List<Map<String, dynamic>>? obj_array;
Text01Entity({
this.int8,
this.int_16,
this.int_32,
this.float,
this.boolean,
this.string,
this.obj,
this.empty_obj,
this.empty_array,
this.str_array,
this.obj_array,
});
factory Text01Entity.fromJson(Map<String, dynamic> json) =>
_$Text01EntityFromJson(json);
Map<String, dynamic> toJson() => _$Text01EntityToJson(this);
}
void main() {
initializeReflectable(); // 初始化反射功能
testReflector();
print('run example finish');
}
final json_test01 = '''
{
"int8": 127,
"int_16": 32767,
"int-32": 2147483647,
"float": 1.0,
"boolean": true,
"string": "str",
"obj": {
"float-01": 1.0,
"boolean": true,
"string": "str"
},
"empty-obj": {},
"empty-array": [],
"str-array": [
""
],
"obj-array": [
{
"float": 1.0,
"string": "str"
}
]
}
''';
void testReflector() {
final jsonMap = jsonDecode(json_test01);
// 创建一个实体实例
Text01Entity entity = Text01Entity.fromJson(jsonMap);
// 使用实例镜像
InstanceMirror instanceMirror = jsonReflector.reflect(entity);
print(jsonEncode(instanceMirror.invoke("toJson", []))); // 调用实例的toJson方法并打印结果
print(jsonEncode(jsonReflector.toJson(entity))); // 使用反射将实例转换为JSON并打印
print("==== decode");
// 使用类镜像
final type = entity.runtimeType;
final classMirror = jsonReflector.reflectType(type) as ClassMirror;
final instance = classMirror.newInstance("fromJson", [jsonMap]);
print(jsonEncode(instance)); // 打印通过类镜像创建的实例
print(jsonEncode(jsonReflector.formJson(jsonMap, type: type))); // 使用反射将JSON转换为实例并打印
// 使用可迭代对象
final iterable = Iterable.generate(3, (index) => jsonMap);
final list = jsonReflector.formIterable<Text01Entity>(iterable).toList();
print("list ${list.runtimeType}"); // 打印列表类型
print(jsonEncode(list)); // 将列表转换为JSON字符串并打印
}
请注意,上述代码中的_$Text01EntityFromJson
和_$Text01EntityToJson
方法是自动生成的,您需要确保使用build_runner
工具来生成这些方法。可以通过运行以下命令生成:
flutter packages pub run build_runner build
更多关于Flutter JSON反射处理插件json_reflectable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter JSON反射处理插件json_reflectable的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在处理Flutter应用中的JSON数据时,json_reflectable
是一个非常有用的插件,它允许你通过反射机制自动生成从JSON到Dart对象的转换代码。这不仅减少了手动编写序列化/反序列化代码的工作量,还提高了代码的可维护性和准确性。以下是一个使用json_reflectable
的示例代码案例。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加json_reflectable
的依赖:
dependencies:
flutter:
sdk: flutter
json_annotation: ^4.0.1 # json_reflectable依赖于json_annotation
dev_dependencies:
build_runner: ^2.0.4
json_reflectable: ^4.0.1
2. 创建数据模型
接下来,创建一个数据模型类,并使用@JsonSerializable()
注解标记它。同时,确保你的类有一个空的构造函数,因为json_serializable
需要它来生成工厂构造函数。
import 'package:json_annotation/json_annotation.dart';
part 'user_model.g.dart'; // 这个文件将由json_reflectable生成
@JsonSerializable()
class UserModel {
final String name;
final int age;
// 空构造函数是必需的
UserModel({required this.name, required this.age});
// 从json_serializable生成的工厂构造函数
factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
// 转换为JSON的Map
Map<String, dynamic> toJson() => _$UserModelToJson(this);
}
3. 生成序列化代码
在项目根目录下运行以下命令来生成序列化代码:
flutter pub run build_runner build
这个命令会读取你的注解并生成user_model.g.dart
文件,其中包含从JSON到UserModel
对象的转换逻辑。
4. 使用生成的代码
现在你可以在你的Flutter应用中使用生成的代码来进行JSON的序列化和反序列化了。
void main() {
// 创建一个UserModel对象
UserModel user = UserModel(name: 'Alice', age: 30);
// 将对象转换为JSON
Map<String, dynamic> userJson = user.toJson();
print('User JSON: $userJson');
// 从JSON转换回UserModel对象
UserModel newUser = UserModel.fromJson(userJson);
print('New User: ${newUser.name}, Age: ${newUser.age}');
}
总结
通过上述步骤,你已经成功地在Flutter项目中集成了json_reflectable
插件,并创建了一个简单的数据模型类来处理JSON数据的序列化和反序列化。这种方法不仅简化了代码,还提高了效率和准确性。记得每次修改数据模型后都要重新运行flutter pub run build_runner build
来更新生成的代码。