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

如何结合JsonSerializable使用泛型?排查代码栈溢出问题

问题分析与解决方案

错误原因

  1. 无限递归导致栈溢出:你的_fromJson<T>和_toJson<T>方法内部直接递归调用自身,没有实现任何实际的JSON与泛型类型T的转换逻辑,触发无限递归后必然出现栈溢出错误。
  2. 泛型继承参数错误:INetworkModel的泛型参数应该是CartResponseModel<T>,而非CartResponseModel,否则不符合泛型类的定义规范。
  3. 未正确使用genericArgumentFactories:JsonSerializable的该特性需要外部传入泛型类型的解析/序列化函数,而非在类内部硬编码无效的递归逻辑。

修正后的实现方案

第一步:定义具体的业务实体类(以Cart为例)

先确保你的业务实体类已经配置好JsonSerializable:

@JsonSerializable()
class Cart {
  final int id;
  final int firmno;
  final int delete;
  final String code;

  Cart({required this.id, required this.firmno, required this.delete, required this.code});

  factory Cart.fromJson(Map<String, dynamic> json) => _$CartFromJson(json);
  Map<String, dynamic> toJson() => _$CartToJson(this);
}

第二步:修正泛型响应模型

重新实现CartResponseModel,正确利用genericArgumentFactories传递泛型类型的解析/序列化逻辑:

@JsonSerializable(explicitToJson: true, genericArgumentFactories: true)
class CartResponseModel<T> extends INetworkModel<CartResponseModel<T>> {
  final T? data;
  final bool? success;
  final String? message;

  CartResponseModel({this.data, this.success, this.message});

  // 带泛型解析器的工厂方法(核心)
  factory CartResponseModel.fromJson(
    Map<String, dynamic> json,
    T Function(Object json) fromJsonT,
  ) => _$CartResponseModelFromJson(json, fromJsonT);

  // 实现INetworkModel的fromJson:若接口要求无参,可根据实际场景调整,或直接使用带参数的工厂方法
  @override
  CartResponseModel<T> fromJson(Map<String, dynamic> json) {
    throw UnimplementedError('请使用带fromJsonT参数的工厂方法解析泛型类型');
  }

  // 带泛型序列化器的toJson方法
  @override
  Map<String, dynamic>? toJson(Object Function(T value) toJsonT) => _$CartResponseModelToJson(this, toJsonT);
}

第三步:实际使用示例

  • 解析单个Cart对象:
final singleCartJson = {
  "data": {"id": 1, "firmno": 2, "delete": 0, "code": "CR00001"},
  "success": true,
  "message": ""
};

final singleCartResponse = CartResponseModel<Cart>.fromJson(
  singleCartJson,
  (json) => Cart.fromJson(json as Map<String, dynamic>),
);
  • 解析Cart列表:
final cartListJson = {
  "data": [{"id": 1, "firmno": 2, "delete": 0, "code": "CR00001"}],
  "success": true,
  "message": ""
};

final cartListResponse = CartResponseModel<List<Cart>>.fromJson(
  cartListJson,
  (json) => (json as List).map((e) => Cart.fromJson(e as Map<String, dynamic>)).toList(),
);

内容的提问来源于stack exchange,提问作者developer new

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 12:56:30