Dart序列化JSON列表报错:JSArray<dynamic>非Map<String,dynamic>子类型
JSON序列化错误修复:JSArray无法转为Map<String, dynamic>
问题根源
你调用HorarioSingle.fromJson时,传入的是jsonDecode(horarios)["horarios"]——这是一个JSArray(对应Dart的List类型),但HorarioSingle.fromJson的参数要求是Map<String, dynamic>(即包含horarios键的完整JSON对象),类型不匹配导致报错。另外HorarioLinha的dia字段映射JSON中的id,命名不一致容易引发混淆。
修复步骤
- 修正参数传递:直接将
jsonDecode(horarios)的完整结果传给HorarioSingle.fromJson,而非仅传入列表部分。 - 统一字段命名(可选):将
HorarioLinha的dia字段改为id,与JSON中的键名保持一致,避免逻辑歧义。 - 处理JSProxy类型:在Web环境下,显式将JSArray转换为Dart List,确保类型兼容。
完整修正代码
import 'dart:convert'; main() { String horarios = '{"horarios": [{"id": "1", "horaInicio": "12", "horaFim": "14", "presenca": "1", "folga": "1"}, {"id": "1", "horaInicio": "12", "horaFim": "14", "presenca": "1", "folga": "2"}]}'; print(horarios); // 传入完整JSON对象而非列表 return HorarioSingle.fromJson(jsonDecode(horarios)); } class HorarioLinha { final String id; // 字段名与JSON键名统一 final String horaInicio; final String horaFim; final String presenca; final String folga; HorarioLinha({ required this.id, required this.horaInicio, required this.horaFim, required this.presenca, required this.folga, }); factory HorarioLinha.fromJson(Map<String, dynamic> json) => HorarioLinha( id: json['id'], horaInicio: json['horaInicio'], horaFim: json['horaFim'], presenca: json['presenca'], folga: json['folga'], ); } class HorarioSingle { final List<HorarioLinha> horarios; HorarioSingle({required this.horarios}); factory HorarioSingle.fromJson(Map<String, dynamic> json) => HorarioSingle( // 显式转换为Dart List,解决JSProxy类型问题 horarios: (json['horarios'] as List).map((horario) => HorarioLinha.fromJson(horario)).toList(), ); }
内容的提问来源于stack exchange,提问作者mrsgidev
相关产品推荐
相关产品推荐

