Swift 4中使用Alamofire 4.7解析JSON并获取api_key的方法
解决新版Alamofire从JSON响应中获取api_key的问题
嘿,我来帮你搞定这个问题!从你打印的响应内容来看,JSON的结构是外层字典包含一个user子字典,api_key就藏在这个user字典里。之前的旧方案都是针对Swift3和老版Alamofire的,我给你适配新版Alamofire(5.x及以上)的两种可行方案:
方案一:用Codable协议解析(类型安全,官方推荐)
这种方式能避免手动类型转换的麻烦,还能保证类型安全,不容易出错。首先你需要定义对应的模型结构体:
// 对应外层的响应结构 struct UserResponse: Codable { let user: User } // 对应user子字典的结构 struct User: Codable { let apiKey: String // 因为JSON里的key是下划线命名的"api_key",和Swift的驼峰命名不一致,这里做个映射 enum CodingKeys: String, CodingKey { case apiKey = "api_key" } }
然后修改你的请求代码,用responseDecodable来处理响应:
Alamofire.request(serverLink!, headers: headers) .responseDecodable(of: UserResponse.self) { response in switch response.result { case .success(let userResponse): // 直接拿到解析好的api_key let targetApiKey = userResponse.user.apiKey print("成功获取api_key:\(targetApiKey)") // 这里可以写你的后续业务逻辑 case .failure(let error): print("请求或解析失败:\(error.localizedDescription)") } }
方案二:继续用responseJSON手动解析(快速适配现有代码)
如果你不想写模型结构体,也可以继续用responseJSON,但要注意一步步安全地解包类型:
Alamofire.request(serverLink!, headers: headers).responseJSON { response in switch response.result { case .success(let responseValue): // 第一步:把响应值转成外层字典 guard let outerDict = responseValue as? [String: Any], // 第二步:取出user子字典 let userDict = outerDict["user"] as? [String: Any], // 第三步:取出api_key并转成String类型 let apiKey = userDict["api_key"] as? String else { print("JSON结构不符合预期,解析失败") return } print("成功拿到api_key:\(apiKey)") // 后续操作 case .failure(let error): print("请求出错:\(error.localizedDescription)") } }
小提示
你之前的代码可能没拿到数据,大概率是因为没有对response.value做逐层的类型转换——新版Alamofire的response.value是Any?类型,必须明确转成字典才能取出里面的嵌套值,直接取是拿不到的哦。
内容的提问来源于stack exchange,提问作者Taras Tomchuk
相关产品推荐
相关产品推荐

