Flutter中如何解析包含动态对象键的JSON数组
Flutter 动态键JSON结构解析方案
实现思路
你给出的JSON结构中,data数组下每个对象仅包含1个动态生成的键,值为员工数据数组。核心解析逻辑是:遍历每个对象的keys属性获取动态键名,再将键对应的值解析为固定结构的员工列表即可,无需提前硬编码所有可能的动态键。
代码实现
1. 定义内层员工数据实体
class EmpItem { final int id; final int empId; EmpItem({required this.id, required this.empId}); factory EmpItem.fromJson(Map<String, dynamic> json) { return EmpItem( id: json['id'], empId: json['emp_id'], ); } }
2. 定义动态键分组实体
用于存储动态键名和对应的员工列表:
class StatusGroup { // 存储动态生成的键名,如accepted、negotiate final String statusName; // 存储键对应的员工列表 final List<EmpItem> items; StatusGroup({required this.statusName, required this.items}); }
3. 定义外层响应实体与核心解析逻辑
import 'dart:convert'; class ApiResponse { final String status; final List<StatusGroup> data; ApiResponse({required this.status, required this.data}); factory ApiResponse.fromJson(Map<String, dynamic> json) { final resStatus = json['status'] as String; final rawDataList = json['data'] as List; List<StatusGroup> parsedData = []; for (var rawItem in rawDataList) { final itemMap = rawItem as Map<String, dynamic>; // 获取动态键名(若单个对象可能有多个动态键,可遍历itemMap.keys处理) final dynamicKey = itemMap.keys.first; // 解析对应员工列表 final rawEmpList = itemMap[dynamicKey] as List; final empList = rawEmpList.map((e) => EmpItem.fromJson(e)).toList(); parsedData.add(StatusGroup(statusName: dynamicKey, items: empList)); } return ApiResponse(status: resStatus, data: parsedData); } }
使用示例
拿到接口返回的JSON字符串后,直接调用解析方法即可:
// 假设responseBody为接口返回的JSON字符串 final Map<String, dynamic> jsonData = jsonDecode(responseBody); ApiResponse response = ApiResponse.fromJson(jsonData); // 遍历获取所有动态键和对应数据 for (var group in response.data) { print('状态类型:${group.statusName}'); print('对应员工数量:${group.items.length}'); }
拓展说明
如果data数组下的单个对象可能包含多个动态键,只需将itemMap.keys.first替换为遍历itemMap.keys的逻辑,逐个处理每个键值对即可。
内容的提问来源于stack exchange,提问作者user17198974
相关产品推荐
相关产品推荐

