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

Dart解析JSON报错:List<dynamic>无法转为Map<String, dynamic>求助

解决Dart JSON解析错误:type 'List' is not a subtype of type 'Map<String, dynamic>'

你遇到的错误核心是服务器返回的JSON是数组(List),但代码里强行把它转换成了Map类型,导致类型不匹配。看你给出的服务器返回示例,确实是用方括号[]包裹的数组结构,每个元素是一个账户对象。

具体修改步骤

  1. 修正解析类型:把json.decode(response.body)的强转类型从Map<String, dynamic>改成List<dynamic>,匹配服务器返回的数组结构。
  2. 遍历数组元素:遍历这个List,每个元素是包含账户信息的Map<String, dynamic>,从中提取对应字段。
  3. 匹配字段名:服务器返回的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:42:22