如何结合JsonSerializable使用泛型?排查代码栈溢出问题
问题分析与解决方案
错误原因
- 无限递归导致栈溢出:你的
_fromJson<T>和_toJson<T>方法内部直接递归调用自身,没有实现任何实际的JSON与泛型类型T的转换逻辑,触发无限递归后必然出现栈溢出错误。 - 泛型继承参数错误:
INetworkModel的泛型参数应该是CartResponseModel<T>,而非CartResponseModel,否则不符合泛型类的定义规范。 - 未正确使用
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
相关产品推荐
相关产品推荐

