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

Dart报错:json.decode参数类型不兼容,List无法赋值给String

问题排查与解决:JSON解析类型不匹配错误

错误根源拆解

  • json.decode() 只接受String类型参数,你错误地把强转成List<Book>的对象传进去,直接触发类型不匹配报错。
  • 多此一举调用response.body.toString():response.body本身就是String类型,完全没必要额外转换。
  • 解析顺序搞反了:应该先把JSON字符串解码成原生Dart集合(List),再把集合里的每个元素转成Book对象,而不是先强转再解码。

修正后的代码示例

假设你的Book类有fromJson构造方法,修正后的fetchAndSetBooksLocal方法如下:

class Books with ChangeNotifier {
  List<Book> _items = [];

  Future<void> fetchAndSetBooksLocal() async {
    final response = await http.get(Uri.parse('你的接口地址'));
    
    // 第一步:把接口返回的字符串解码成List<dynamic>
    final List<dynamic> extractedData = json.decode(response.body);
    
    // 第二步:把List<dynamic>转成List<Book>
    _items = extractedData
        .map((bookJson) => Book.fromJson(bookJson as Map<String, dynamic>))
        .toList();
    
    notifyListeners();
  }
}

// 配套的Book类fromJson构造示例
class Book {
  final String id;
  final String title;

  Book({required this.id, required this.title});

  factory Book.fromJson(Map<String, dynamic> json) {
    return Book(
      id: json['id'],
      title: json['title'],
    );
  }
}

额外注意事项

  • 确认接口返回的是合法的JSON数组格式(比如[{"id":"1","title":"xxx"},...]),不然解码时会抛出格式错误。
  • Book.fromJson要和接口返回的字段一一对应,避免字段缺失或类型不匹配。
  • 可以加try-catch块处理异常,比如网络请求失败、JSON格式错误:
Future<void> fetchAndSetBooksLocal() async {
  try {
    final response = await http.get(Uri.parse('你的接口地址'));
    if (response.statusCode != 200) {
      throw Exception('请求失败:${response.statusCode}');
    }
    final List<dynamic> extractedData = json.decode(response.body);
    _items = extractedData
        .map((bookJson) => Book.fromJson(bookJson as Map<String, dynamic>))
        .toList();
    notifyListeners();
  } catch (error) {
    rethrow; // 这里可以换成自定义的错误处理逻辑
  }
}

内容的提问来源于stack exchange,提问作者best_of_man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:15:57