Flutter使用json_serializable解析JSON数组遇阻求助
解决json_serializable解析对象数组失败的问题
我成功获取到JSON数据,但用json_serializable解析其中的对象数组时失败。在生成的序列化代码中,实例化MarketsResponse时抛出异常,后续打印语句未执行。
相关代码
模型类代码
import 'package:coinbase_sockets/deriv_models/active_symbols_response.dart'; import 'package:json_annotation/json_annotation.dart'; part 'markets_response.g.dart'; @JsonSerializable() class MarketsResponse { @JsonKey(name: 'active_symbols') List<ActiveSymbolsResponse> active_symbols; MarketsResponse(this.active_symbols); factory MarketsResponse.fromJson(Map<String,dynamic> data) { print('##---------------------coming--------------------------'); var l = _$MarketsResponseFromJson(data); print('##lrngth l'+l.toString()); return _$MarketsResponseFromJson(data);} Map<String,dynamic> toJson() => _$MarketsResponseToJson(this); }
修改后的生成类代码(问题点所在)
// GENERATED CODE - DO NOT MODIFY BY HAND part of 'markets_response.dart'; // ************************************************************************** // JsonSerializableGenerator // ************************************************************************** MarketsResponse _$MarketsResponseFromJson(Map<String, dynamic> json) { print('##---------------------market--------------------------'+json.toString()); // 能执行到这里 var mm= MarketsResponse( json['active_symbols'] as List<ActiveSymbolsResponse> ); print('##---------------------mm--------------------------'); // 这里未执行,说明实例化出错 return MarketsResponse( json['active_symbols'] as List<ActiveSymbolsResponse> ); } Map<String, dynamic> _$MarketsResponseToJson(MarketsResponse instance) => <String, dynamic>{ 'active_symbols': instance.active_symbols, };
问题原因
- 错误的类型强转:JSON返回的
json['active_symbols']本质是List<dynamic>,每个元素是Map<String, dynamic>,无法直接强转为List<ActiveSymbolsResponse>,必须逐个调用对应类的fromJson方法转换。 - 手动修改生成文件:生成类头部明确标注了
// GENERATED CODE - DO NOT MODIFY BY HAND,手动修改不仅会在下次构建时被覆盖,还容易引入逻辑错误。
解决方案
步骤1:确保子模型类正确配置json_serializable
检查ActiveSymbolsResponse类是否添加了@JsonSerializable()注解并生成了对应序列化文件:
import 'package:json_annotation/json_annotation.dart'; part 'active_symbols_response.g.dart'; @JsonSerializable() class ActiveSymbolsResponse { // 你的字段定义 ActiveSymbolsResponse(); factory ActiveSymbolsResponse.fromJson(Map<String, dynamic> json) => _$ActiveSymbolsResponseFromJson(json); Map<String, dynamic> toJson() => _$ActiveSymbolsResponseToJson(this); }
步骤2:恢复主模型类的默认fromJson实现
不要在主模型类的fromJson里加额外打印逻辑,保持自动生成的调用:
factory MarketsResponse.fromJson(Map<String,dynamic> data) => _$MarketsResponseFromJson(data);
步骤3:重新生成序列化代码
执行命令重新生成正确的序列化逻辑:
flutter pub run build_runner build
此时生成的正确转换代码会自动处理数组元素的转换,示例如下:
MarketsResponse _$MarketsResponseFromJson(Map<String, dynamic> json) => MarketsResponse( (json['active_symbols'] as List<dynamic>) .map((e) => ActiveSymbolsResponse.fromJson(e as Map<String, dynamic>)) .toList(), );
调试建议
如果仍有问题,可先打印JSON数组的类型和内容,确认结构是否匹配模型:
factory MarketsResponse.fromJson(Map<String,dynamic> data) { print('active_symbols类型: ${data['active_symbols'].runtimeType}'); print('active_symbols内容: ${data['active_symbols']}'); return _$MarketsResponseFromJson(data); }
内容的提问来源于stack exchange,提问作者md gouse
相关产品推荐
相关产品推荐

