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,提问作者이유림
相关产品推荐
相关产品推荐

