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

Flutter中将Map数组JSON转为List<Employee>报错的正确解析方法

正确解析Map数组JSON的方法

问题背景

我有如下格式的Map数组JSON数据:

[  
    {
        "id": "2a5",
        "employeeNumber": "101",
        "firstName": "Sachin",
        "lastName": "Agrawal"
    },
    {
        "id": "1f7",
        "employeeNumber": "151",
        "firstName": "Karsten",
        "lastName": "Andersen"
    }
]

尝试用以下代码解析:

List<Employee> employees = (jsonDecode(response.data) as List)
          .map((data) => Employee.fromJson(data))
          .toList();

但出现错误:

List<dynamic>' is not a subtype of type 'String'

同时触发异常:

Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'String' 

请问解析这类JSON的正确方法是什么?


解决方法

这个错误的核心原因是:你传入jsonDecode的response.data已经是解码后的List<dynamic>类型,而非原始的JSON字符串,重复调用jsonDecode就会导致类型不匹配。

根据response.data的实际类型,分两种情况处理:

情况1:response.data已自动解码为List

很多HTTP客户端(比如Dio)会自动将JSON响应解码为对应的List/Map,此时直接转换即可:

List<Employee> employees = (response.data as List)
    .map((data) => Employee.fromJson(data as Map<String, dynamic>))
    .toList();

情况2:response.data是原始JSON字符串

如果response.data确实是未解码的String,那么你的原代码逻辑没问题,但建议增加类型断言确保类型安全:

import 'dart:convert';

List<Employee> employees = (jsonDecode(response.data) as List<dynamic>)
    .map((data) => Employee.fromJson(data as Map<String, dynamic>))
    .toList();

补充:确保Employee类的fromJson方法正确

你的Employee类的fromJson方法需要正确接收Map<String, dynamic>参数,示例实现:

class Employee {
  final String id;
  final String employeeNumber;
  final String firstName;
  final String lastName;

  Employee({
    required this.id,
    required this.employeeNumber,
    required this.firstName,
    required this.lastName,
  });

  factory Employee.fromJson(Map<String, dynamic> json) {
    return Employee(
      id: json['id'] as String,
      employeeNumber: json['employeeNumber'] as String,
      firstName: json['firstName'] as String,
      lastName: json['lastName'] as String,
    );
  }
}

内容的提问来源于stack exchange,提问作者Tanjim ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:40:41