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

Flutter JSON序列化报错:'String'非'index'的'int'子类型求助

解决Dart JSON序列化时“type 'String' is not a subtype of type 'int' of 'index'”错误

错误本质

这个报错核心是你用字符串当列表(List)的索引了——列表的索引必须是整数,一旦用字符串去访问列表元素,或者把本该是对象(Map)的JSON节点当成列表来处理,就会触发这个错误。

排查与解决步骤

1. 核对JSON结构和实体类字段

先把接口返回的完整JSON打出来,重点对比Shop实体类的定义:

  • 如果JSON里某字段是对象格式(比如"shops": {"0": "店铺1", "1": "店铺2"}),但你在实体类里把这个字段定义成了List<Shop>,解析时就会用字符串键去访问列表,直接报错。这种情况要么把实体类字段改成Map<String, Shop>,要么和后端确认是否应该返回数组格式("shops": [{"name":"店铺1"}, ...])。
  • 反过来,如果JSON是数组,但你实体类里定义成了Map,也会出问题,得对应调整类型。

2. 检查API解析逻辑

看你生成List的代码,别把Map当成List来遍历:

  • 错误写法(如果接口返回的data是Map而非数组):
var jsonData = jsonDecode(response.body);
List<Shop> shops = jsonData['data'].map((item) => Shop.fromJson(item)).toList();

这里jsonData['data']是Map,map遍历的时候会把字符串键当索引传给列表,直接报错。

  • 正确写法(Map转List取values):
List<Shop> shops = jsonData['data'].values.map((item) => Shop.fromJson(item)).toList();

3. 检查实体类的fromJson方法

别在fromJson里用整数索引访问Map:

  • 错误写法:
class Shop {
  final String id;
  Shop({required this.id});
  factory Shop.fromJson(Map<String, dynamic> json) {
    return Shop(
      id: json[0], // JSON是{"id":"1"}这种对象,用整数索引访问Map会报错
    );
  }
}
  • 正确写法(用字符串键对应JSON字段):
factory Shop.fromJson(Map<String, dynamic> json) {
  return Shop(
    id: json['id'],
  );
}

4. 打印JSON快速定位

实在找不到问题,就在解析前把接口返回的完整JSON打出来:

print('接口返回JSON: ${response.body}');

对比实体类的每个字段类型,一眼就能看出哪里不匹配。

内容的提问来源于stack exchange,提问作者이유림

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:16:01