Flutter嵌套JSON列表解析报错:List无法转为String类型
解决Flutter嵌套JSON解析异常:
type 'List' is not a subtype of type 'String' 错误根源
你在MachineResponse.fromJson构造方法里,把JSON响应中数组类型的字段错误地当作字符串类型来解析,直接触发了类型不匹配异常。
分步解决方法
1. 先核对接口返回的JSON结构
假设你的接口返回嵌套JSON类似以下结构(如果实际结构不同,替换成你真实的响应):
{ "code": 200, "message": "请求成功", "data": [ { "machine_id": "M001", "recharges": [ {"id": 1, "amount": 50}, {"id": 2, "amount": 100} ] } ] }
2. 修正Model类的类型定义与解析逻辑
错误示例(触发异常的写法)
class MachineResponse { final String data; // 错误:实际是List类型,却定义成String MachineResponse({required this.data}); factory MachineResponse.fromJson(Map<String, dynamic> json) { return MachineResponse( data: json['data'] as String, // 错误:把List强转为String ); } }
正确的Model写法(匹配嵌套JSON结构)
// 充值记录子Model class Recharge { final int id; final int amount; Recharge({required this.id, required this.amount}); factory Recharge.fromJson(Map<String, dynamic> json) { return Recharge( id: json['id'] as int, amount: json['amount'] as int, ); } } // 机器信息子Model class Machine { final String machineId; final List<Recharge> recharges; Machine({required this.machineId, required this.recharges}); factory Machine.fromJson(Map<String, dynamic> json) { // 解析嵌套的recharges数组 final rechargeList = json['recharges'] as List; List<Recharge> rechargeData = rechargeList.map((item) => Recharge.fromJson(item)).toList(); return Machine( machineId: json['machine_id'] as String, recharges: rechargeData, ); } } // 顶层响应Model class MachineResponse { final int code; final String message; final List<Machine> data; // 正确:定义为List<Machine>类型 MachineResponse({required this.code, required this.message, required this.data}); factory MachineResponse.fromJson(Map<String, dynamic> json) { // 解析顶层的data数组 final dataList = json['data'] as List; List<Machine> machineData = dataList.map((item) => Machine.fromJson(item)).toList(); return MachineResponse( code: json['code'] as int, message: json['message'] as String, data: machineData, // 传入解析后的List<Machine> ); } }
3. 修正网络请求的解析逻辑
确保请求后将响应体正确转为Map,再调用Model的fromJson方法:
import 'dart:convert'; import 'package:http/http.dart' as http; Future<MachineResponse> fetchMachineData() async { final response = await http.get(Uri.parse('你的接口URL')); if (response.statusCode == 200) { final Map<String, dynamic> jsonMap = json.decode(response.body); return MachineResponse.fromJson(jsonMap); } else { throw Exception('请求失败:${response.statusCode}'); } }
4. 调试技巧
如果还是无法定位错误字段,可以在fromJson方法中添加打印语句,查看字段实际类型:
factory MachineResponse.fromJson(Map<String, dynamic> json) { print('data字段类型:${json['data'].runtimeType}'); // 打印确认是List还是String // 其余解析代码... }
内容的提问来源于stack exchange,提问作者Ajay Ramprasad
相关产品推荐
相关产品推荐

