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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:15:35