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

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,
    };

问题原因

  1. 错误的类型强转:JSON返回的json['active_symbols']本质是List<dynamic>,每个元素是Map<String, dynamic>,无法直接强转为List<ActiveSymbolsResponse>,必须逐个调用对应类的fromJson方法转换。
  2. 手动修改生成文件:生成类头部明确标注了// 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:31:37