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

