Flutter 解析多数组嵌套JSON失败 遍历取值打印obj为null
问题核心根因
- 类型判断错误:接口返回的顶层
data字段是键为字符串的Map(不是数组),代码中用数字索引data[i]遍历Map,由于Map的键全是字符串,不存在数字类型的键,取出来的结果必然为null,这是print(obj)始终为null的直接原因。 - 取值路径错误:
service_types、vehicle_models、accessories、working_statuses这四个字段是直接挂在dataMap下的独立数组,不是嵌在数组循环元素里的对象。 - 类型不匹配隐患:模型类字段全部定义为String,但接口返回的
id是int类型,即使取到值也会触发类型转换错误。 - 业务逻辑错位:当前代码试图在单循环里拼接四个无关联平行数组的元素,不符合接口返回的独立列表结构,会造成数据错乱。
具体修复步骤
- 第一步:修正取值逻辑,先从Map中提取独立数组
删除原来针对data做数字索引循环的错误代码,先直接从dataMap里取出四个独立数组并做空值兜底:// 确认data是Map后,直接取对应字段 if (data is Map) { final List serviceTypes = (data['service_types'] as List?) ?? []; final List vehicleModels = (data['vehicle_models'] as List?) ?? []; final List accessories = (data['accessories'] as List?) ?? []; final List workingStatuses = (data['working_statuses'] as List?) ?? []; - 第二步:按业务需求组装模型数据
由于四个数组是相互独立的平行列表,需要根据实际业务分别遍历对应数组,生成模型实例。如果是要把所有选项统一存入DataList做下拉选择源,参考写法:// 遍历服务类型数组生成条目 for (var item in serviceTypes) { DataList.add(GetAllModel( service_type_id: item['id'].toString(), service_type_name: item['name'].toString(), )); } // 遍历车辆模型数组生成条目 for (var item in vehicleModels) { DataList.add(GetAllModel( vehicle_models_id: item['id'].toString(), vehicle_models_name: item['name'].toString(), )); } // 配件、工作状态数组的遍历逻辑和上面保持一致注意:如果你的业务确实需要把四个数组的元素按索引一一对应拼接到同一条模型记录里,需要提前确认接口是否返回了对应关联关系,不能默认数组索引一一匹配,否则会出现数据张冠李戴的问题。
- 第三步:重构模型类适配空值和类型兼容
把原来的必传位置参数改成带默认值的命名参数,避免因为缺字段抛异常:class GetAllModel { String service_type_id; String service_type_name; String vehicle_models_id; String vehicle_models_name; String accessories_id; String accessories_name; String working_statuses_id; String working_statuses_name; GetAllModel({ this.service_type_id = '', this.service_type_name = '', this.vehicle_models_id = '', this.vehicle_models_name = '', this.accessories_id = '', this.accessories_name = '', this.working_statuses_id = '', this.working_statuses_name = '', }); } - 第四步:更新UI状态
所有数据组装完成后,再调用setState刷新UI:setState(() { print("UI UPDATED"); }); }
快速排查验证方法
- 先打印
data.runtimeType,确认返回类型是_Map<String, dynamic>,验证之前的类型判断错误是否存在。 - 分别打印四个提取出来的数组长度,和接口返回的条目数做对比,确认解析路径正确。
- 逐个打印数组里的元素字段值,确认能正常拿到
id和name后再往模型里塞值,避免一次性堆代码难定位问题。
内容的提问来源于stack exchange,提问作者Abhijith
相关产品推荐
相关产品推荐

