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

Flutter中如何将API返回的字符串数组转为可遍历数组?

解决方案

你的问题出在错误地将字符串拆分为字符列表,而非解析JSON结构。直接用replaceAll去引号再调用toList(),只会把字符串拆成单个字符的数组,完全达不到解析成对象列表的目的。正确做法是使用Dart的JSON解析工具处理:

步骤1:导入JSON解析库

在文件顶部导入dart:convert:

import 'dart:convert';

步骤2:将非标准JSON字符串转为标准格式并解析

你拿到的字符串"[{id: 15}, {id: 150}]"不是标准JSON(标准JSON要求键必须用双引号包裹),所以需要先把键名加上双引号,再用jsonDecode解析为List:
修改fetchSaleDetails方法中的处理逻辑:

fetchSaleDetails() async {
  var response = await SaleRepository().showSale(widget.saleId);
  if (response['result'] == true) {
    setState(() {
      saleDetails = response['sales'];
      // 处理items字符串:给所有键名加上双引号,转为标准JSON
      String rawItems = saleDetails['items'];
      String standardJson = rawItems.replaceAll(RegExp(r'(\w+):'), r'"$1":');
      // 解析为List<Map>
      saleDetails['items'] = jsonDecode(standardJson);
      saleDetailsFetched = true;
    });
  } else {
    showToast("Something went wrong", context);
  }
}

步骤3:正常遍历解析后的列表

现在saleDetails['items']已经是List<Map>类型,可以直接用ListView.builder遍历:

Container(
  height: 250,
  child: ListView.builder(
    itemCount: saleDetails['items'].length,
    itemBuilder: (context, index) {
      var item = saleDetails['items'][index];
      return Container(
        padding: EdgeInsets.symmetric(vertical: 8),
        child: Text('商品ID: ${item['id']}'),
      );
    },
  ),
)

补充说明

如果你的接口后续能返回标准JSON格式(比如"[{\"id\": 15}, {\"id\": 150}]"),可以跳过键名替换的步骤,直接调用jsonDecode(saleDetails['items'])即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:40:51