Flutter中如何解析REST API返回的JSON数据提取字符串列表
Flutter JSON接口解析问题修复方案
现有代码的问题
- 你错误地将接口返回的
_categoryResponse['data']数组直接转为字符串,丢失了数组结构,导致后续无法提取每个分类的name字段 - 缺失了请求状态校验、接口返回状态校验、异常捕获逻辑,容易出现崩溃问题
调整后代码(直接提取字符串列表)
不需要额外定义模型类,直接遍历数据提取你需要的name字段即可:
import 'package:http/http.dart' as http; import 'dart:convert'; // 存储最终的分类名称列表 List<String> allCategories = []; Future fetchCategories() async { try { final response = await http.get(_categories); // 先校验HTTP请求是否成功 if (response.statusCode == 200) { final Map<String, dynamic> resJson = jsonDecode(response.body); // 校验接口返回的业务状态 if (resJson['status'] == true) { // 获取data数组,遍历提取所有name字段 final List<dynamic> dataList = resJson['data']; allCategories = dataList.map((item) => item['name'].toString()).toList(); // 此时allCategories就是你需要的格式:['Chicken roll', 'Fresh salads', 'Wrape', 'Pizza', 'Fried chicken', 'Veggie', 'Burgers'] } else { print('接口业务错误:${resJson['error_message']}'); } } else { print('HTTP请求错误,状态码:${response.statusCode}'); } } catch (e) { print('请求或解析出错:$e'); } }
可选:保留完整分类数据的模型类方案
如果你后续需要用到分类的id字段,可以先定义模型类再解析:
- 定义分类模型
class Category { final int id; final String name; Category({required this.id, required this.name}); factory Category.fromJson(Map<String, dynamic> json) { return Category( id: json['id'], name: json['name'], ); } }
- 解析逻辑调整
List<Category> allCategoryModels = []; List<String> allCategories = []; Future fetchCategories() async { // 前面的请求、校验逻辑和上面一致 // ... if (resJson['status'] == true) { final List<dynamic> dataList = resJson['data']; allCategoryModels = dataList.map((item) => Category.fromJson(item)).toList(); allCategories = allCategoryModels.map((e) => e.name).toList(); } // ... }
内容的提问来源于stack exchange,提问作者CodeSadhu
相关产品推荐
相关产品推荐

