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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:24:28