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
相关产品推荐
相关产品推荐

