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

Swift中从可选对象(字典数组)提取name字段失败,请求技术协助

问题分析与解决方案

你遇到的核心问题是:响应里的report_data字段并不是直接的数组,而是一个JSON格式的字符串(看响应里它被双引号包裹着,里面才是数组的JSON内容)。你现在的代码直接把它当成字典/数组去访问下标,自然拿不到值。另外原代码还有个逻辑错误——return nil之后的遍历代码永远不会执行,得调整顺序。

修正后的完整代码

func parseResponse(text: String) -> [[String: Any]]? {
    guard let data = text.data(using: .utf8) else {
        return nil
    }
    
    do {
        // 第一步:解析整个响应JSON
        guard let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else {
            return nil
        }
        
        // 第二步:取出report_data的字符串值
        guard let reportDataStr = dict["report_data"] as? String,
              let reportDataData = reportDataStr.data(using: .utf8) else {
            return nil
        }
        
        // 第三步:把report_data的字符串解析成数组
        guard let reportDataArray = try JSONSerialization.jsonObject(with: reportDataData, options: []) as? [[String: Any]] else {
            return nil
        }
        
        // 第四步:遍历数组获取name字段
        for item in reportDataArray {
            if let name = item["name"] as? String {
                print(name)
            }
        }
        
        return reportDataArray
    } catch {
        print(error.localizedDescription)
        return nil
    }
}

关键步骤说明

  • 先解析外层的JSON,拿到包含report_data的字典
  • 把report_data的字符串内容转换成Data,再做一次JSON解析,得到真正的数组
  • 遍历数组里的每个字典,就能正常取出name字段了

额外提示

如果你的项目支持Swift 5+,更推荐使用Codable来解析JSON,代码会更简洁且类型安全,比如可以定义对应的模型:

struct ResponseModel: Codable {
    let reportData: [ReportItem]
    
    // 对应JSON里的蛇形键名
    enum CodingKeys: String, CodingKey {
        case reportData = "report_data"
    }
}

struct ReportItem: Codable {
    let name: String
    let value: String
}

然后解析的时候直接用JSONDecoder,就不用手动处理多层解析的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:54:10