Flutter JSON反射处理插件json_reflectable的使用

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

Flutter JSON反射处理插件json_reflectable的使用

特性

这个包允许程序员为Dart对象添加注解,以反射调用fromJsontoJson方法。

开始使用

  1. 在您的pubspec.yaml文件中添加以下依赖项:

    dependencies:
      json_reflectable: ^1.0.0
    
  2. 或者在终端中运行以下命令:

    flutter pub add json_reflectable
    

使用方法

  1. 在您的main.dart文件中添加以下代码:

    import 'main.reflectable.dart';
    
    void main() {
      initializeReflectable(); // 初始化反射功能
      //...
    }
    
  2. 为需要反射的类添加@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);
    }
    
  3. 使用实例镜像:

    final testJson = jsonDecode('''
    {
      "float": 1.0,
      "string": "str"
    }
    ''');
    TextEntity instance = TextEntity.fromJson(testJson);
    print(jsonReflector.toJson(instance)); // 将实例转换为JSON字符串
    
  4. 使用类镜像:

    TextEntity instance = jsonReflector.formJson<TextEntity>(testJson); // 从JSON创建实例
    print(instance.toJson()); // 将实例转换为JSON字符串
    
  5. 使用可迭代对象:

    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

1 回复

更多关于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来更新生成的代码。

回到顶部