Flutter中如何解析包含嵌套列表结构的JSON数据
问题修复方案
你当前解析失败的核心原因有两点:
- 接口返回的JSON根结构是对象,员工数组存储在根对象的
Employee字段下,原有代码直接将解码结果强转为List,会触发类型不匹配错误。 - 顶层反序列化函数没有适配根JSON结构,同时缺少空值兼容逻辑,字段缺失时会直接抛错。
另外你提供的JSON示例存在语法错误,每个对象的id字段后缺失逗号,实际使用时需要保证JSON格式合法。
修正后的网络请求代码
Future<List<EmployeeModel>> fetchEmployeeList() async { try { final response = await http.get(Uri.parse(url)); if (response.statusCode == 200) { // 根节点为Map类型,先解码为Map final Map<String, dynamic> responseData = jsonDecode(response.body); // 提取Employee字段对应的员工列表 final List employeeData = responseData['Employee'] as List; final employeeList = employeeData.map((e) => EmployeeModel.fromJson(e as Map<String, dynamic>)).toList(); return employeeList; } else { throw Exception("Failed to load employee data"); } } catch (e) { print(e); rethrow; } }
修正后的模型类代码
import 'dart:convert'; List<EmployeeModel> employeeModelFromJson(String str) { final Map<String, dynamic> jsonData = json.decode(str); return List<EmployeeModel>.from( (jsonData['Employee'] as List).map((x) => EmployeeModel.fromJson(x as Map<String, dynamic>)) ); } String employeeModelToJson(List<EmployeeModel> data) => json.encode({ "Employee": List<dynamic>.from(data.map((x) => x.toJson())) }); class EmployeeModel { EmployeeModel({ required this.id, required this.name, required this.countries, }); int id; String name; List<Country> countries; factory EmployeeModel.fromJson(Map<String, dynamic> json) => EmployeeModel( id: json["id"] as int, name: json["name"] as String, // 增加空兜底,兼容Countries字段缺失的场景 countries: json["Countries"] == null ? [] : List<Country>.from( (json["Countries"] as List).map((x) => Country.fromJson(x as Map<String, dynamic>)) ), ); Map<String, dynamic> toJson() => { "id": id, "name": name, "Countries": List<dynamic>.from(countries.map((x) => x.toJson())), }; } class Country { Country({ required this.id, required this.country, }); int id; String country; factory Country.fromJson(Map<String, dynamic> json) => Country( id: json["id"] as int, country: json["country"] as String, ); Map<String, dynamic> toJson() => { "id": id, "country": country, }; }
补充说明
- 修正后代码适配了空安全规范,所有必填字段添加
required修饰,避免初始化错误。 - 原有代码中嵌套
Country列表的解析逻辑是正确的,只要外层正确提取到Employee数组,嵌套结构会自动完成解析。 - 合法的JSON结构需要补全缺失的逗号,参考如下:
{ "Employee": [ { "id":1, "name": "John", "Countries": [ { "id" :1, "country": "Uk" }, { "id" :2, "country": "USA" }, { "id" :3, "country": "Germany" } ] } ] }
内容的提问来源于stack exchange,提问作者Hamou Ouyaba
相关产品推荐
相关产品推荐

