使用SwiftyJson解析JSON失败,报Thread 1: signal SIGABRT错误求助
问题原因
崩溃的核心原因是返回的JSON顶层结构是单个字典({}),但你的代码强行将response.value强制转换为字典数组([[String : Any]]),强制解包(as!)失败直接触发SIGABRT崩溃。
看你提供的JSON响应,顶层是包含id、choices等字段的对象,不是数组,所以response.value实际类型是[String: Any],而非[[String: Any]]。
修复方案
方案1:修正原生类型转换(不依赖SwiftyJSON)
将类型转换改为字典类型,同时用安全转换替代强制解包:
AF.request(...).responseJSON { response in print("response: \(response)") switch response.result { case .success(let value): // 转换为单个字典而非数组 if let jsonDict = value as? [String: Any] { print("JSON: \(jsonDict)") // 获取choices数组 if let choices = jsonDict["choices"] as? [[String: Any]] { print("choices: \(choices)") // 取第一个choice的text字段 if let firstChoice = choices.first, let jobText = firstChoice["text"] as? String { print("职位列表:\n\(jobText)") } } } break case .failure(let error): print("错误信息: \(error.localizedDescription)") break } }
方案2:用SwiftyJSON简化解析(推荐)
既然已经引入SwiftyJSON,直接用它处理可避免大量手动类型判断:
AF.request(...).responseJSON { response in print("response: \(response)") switch response.result { case .success(let value): let json = JSON(value) // 直接获取choices数组,arrayValue会自动处理空值 let choices = json["choices"].arrayValue // 取第一个choice的text字段,stringValue返回空字符串避免崩溃 let jobListText = choices.first?["text"].stringValue ?? "" print("职位列表:\n\(jobListText)") break case .failure(let error): print("错误信息: \(error.localizedDescription)") break } }
关键注意事项
- 永远避免用
as!做类型转换,强制解包会在类型不匹配时直接崩溃,改用as?做安全转换。 - 先确认接口返回的JSON结构(对象/数组),再对应选择转换类型。
- SwiftyJSON的
arrayValue、stringValue等方法会自动处理可选值,返回默认空值,避免空指针问题。
内容的提问来源于stack exchange,提问作者Mansidak
相关产品推荐
相关产品推荐

