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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:15:19