Flutter:Json序列化抽象构造函数的可行替代方案问询
Dart 抽象 Json 序列化类的优化实现方案
核心思路
通过抽象方法约束 + 静态泛型方法绕开 Dart 构造函数不属于接口的限制,将dart:convert依赖完全封装在抽象类内,子类仅需实现指定方法,无需重复编写序列化模板代码。
具体实现代码
抽象基类 JsonSerializable
import 'dart:convert'; abstract class JsonSerializable { // 强制子类实现:将对象转为Map结构 Map<String, dynamic> toJson(); // 通用转JSON字符串方法,子类直接继承使用 String toJsonString() { return jsonEncode(toJson()); } // 静态泛型方法:统一处理JSON字符串转对象逻辑,子类无需重复实现 static T fromJsonString<T extends JsonSerializable>( String jsonStr, T Function(Map<String, dynamic>) fromJson, ) { final map = jsonDecode(jsonStr); return fromJson(map); } }
子类示例(以User类为例)
class User extends JsonSerializable { final String name; final int age; // 子类必须实现的fromJson构造函数(编译器会检查,未实现直接报错) User.fromJson(Map<String, dynamic> json) : name = json['name'], age = json['age']; @override Map<String, dynamic> toJson() { return { 'name': name, 'age': age, }; } }
用法示例
void main() { // 对象转JSON字符串 final user = User(name: 'Kira', age: 25); final jsonStr = user.toJsonString(); print(jsonStr); // 输出: {"name":"Kira","age":25} // JSON字符串转对象 final decodedUser = JsonSerializable.fromJsonString(jsonStr, User.fromJson); print(decodedUser.name); // 输出: Kira }
方案符合的目标
- 子类无重复代码:子类仅需实现
toJson()方法和fromJson构造函数,toJsonString和通用反序列化逻辑直接复用抽象类实现 - dart:convert依赖集中:仅抽象类需要导入
dart:convert,子类完全无需依赖该库 - 强制子类实现要求:
toJson()为抽象方法,子类未实现会触发编译报错fromJson构造函数虽无法作为抽象构造函数约束,但调用fromJsonString时必须传入子类的fromJson构造函数,未实现则编译器会提示找不到该方法,间接实现强制约束
内容的提问来源于stack exchange,提问作者Kira Resari
相关产品推荐
相关产品推荐

