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
相关产品推荐
相关产品推荐

