You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:10:34