Dart解析JSON报错:List<dynamic>无法转为Map<String, dynamic>求助
解决Dart JSON解析错误:type 'List' is not a subtype of type 'Map<String, dynamic>'
你遇到的错误核心是服务器返回的JSON是数组(List),但代码里强行把它转换成了Map类型,导致类型不匹配。看你给出的服务器返回示例,确实是用方括号[]包裹的数组结构,每个元素是一个账户对象。
具体修改步骤
- 修正解析类型:把
json.decode(response.body)的强转类型从Map<String, dynamic>改成List<dynamic>,匹配服务器返回的数组结构。 - 遍历数组元素:遍历这个List,每个元素是包含账户信息的
Map<String, dynamic>,从中提取对应字段。 - 匹配字段名:服务器返回的id字段是
cID,要替换你代码里的accountID,注意类型转换(如果Accounts的id是String类型,需把数字转成字符串)。
修正后的完整代码
import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; import './user_credentials_struct.dart'; class Credentials with ChangeNotifier { List<Accounts> _items = []; List<Accounts> get items { return [..._items]; } Future<void> fetchAccounts() async { final selectAccountUrl = Uri.parse('https://cs.csub.edu/~tesscuro/database/selectAccounts.php'); try { final response = await http.get(selectAccountUrl); // 修正:解析结果转为List<dynamic>,匹配服务器返回的数组结构 final receivedData = json.decode(response.body) as List<dynamic>; final List<Accounts> loadedData = []; // 遍历数组,逐个处理每个账户对象 for (final item in receivedData) { final accountMap = item as Map<String, dynamic>; loadedData.add( Accounts( // 从cID字段获取id,转成字符串(如果Accounts的id是String类型) id: accountMap['cID'].toString(), siteUrl: accountMap['url'], password: accountMap['password'], userName: accountMap['username'], ), ); } _items = loadedData; notifyListeners(); } catch (error) { rethrow; } } }
额外说明
- 如果你的
Accounts类中id字段是int类型,直接用accountMap['cID'] as int即可,无需转字符串。 - 以后解析JSON前,先确认返回结构:方括号
[]开头是List,花括号{}开头是Map,别搞混类型转换。
内容的提问来源于stack exchange,提问作者Deucal
相关产品推荐
相关产品推荐

