Как разобрать ответ JSON от API Alamofire в Swift?

Следующий код, который я написал, и я получаю ответ в JSON, но тип JSON – это «AnyObject», и я не могу преобразовать его в массив, чтобы использовать его.

Alamofire.request(.POST, "MY URL", parameters:parameters, encoding: .JSON) .responseJSON { (request, response, JSON, error) in println(JSON?) } 

9 Solutions collect form web for “Как разобрать ответ JSON от API Alamofire в Swift?”

Ответ на Swift 2.0 Alamofire 3.0 должен выглядеть следующим образом:

 Alamofire.request(.POST, url, parameters: parameters, encoding:.JSON).responseJSON { response in switch response.result { case .Success(let JSON): print("Success with JSON: \(JSON)") let response = JSON as! NSDictionary //example if there is an id let userId = response.objectForKey("id")! case .Failure(let error): print("Request failed with error: \(error)") } } 

https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%203.0%20Migration%20Guide.md

UPDATE для Alamofire 4.0 и Swift 3.0:

 Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default) .responseJSON { response in print(response) //to get status code if let status = response.response?.statusCode { switch(status){ case 201: print("example success") default: print("error with response status: \(status)") } } //to get JSON return value if let result = response.result.value { let JSON = result as! NSDictionary print(JSON) } } 

как упоминалось выше, вы можете использовать библиотеку SwiftyJSON и получать свои значения, как я сделал ниже

 Alamofire.request(.POST, "MY URL", parameters:parameters, encoding: .JSON) .responseJSON { (request, response, data, error) in var json = JSON(data: data!) println(json) println(json["productList"][1]) } 

мой список продуктов json возвращается из сценария

 { "productList" :[ {"productName" : "PIZZA","id" : "1","productRate" : "120.00","productDescription" : "PIZZA AT 120Rs","productImage" : "uploads\/pizza.jpeg"}, {"productName" : "BURGER","id" : "2","productRate" : "100.00","productDescription" : "BURGER AT Rs 100","productImage" : "uploads/Burgers.jpg"} ] } 

вывод :

 { "productName" : "BURGER", "id" : "2", "productRate" : "100.00", "productDescription" : "BURGER AT Rs 100", "productImage" : "uploads/Burgers.jpg" } 

Я нашел ответ на GitHub для Swift2

https://github.com/Alamofire/Alamofire/issues/641

 Alamofire.request(.GET, URLString, parameters: ["foo": "bar"]) .responseJSON { request, response, result in switch result { case .Success(let JSON): print("Success with JSON: \(JSON)") case .Failure(let data, let error): print("Request failed with error: \(error)") if let data = data { print("Response data: \(NSString(data: data, encoding: NSUTF8StringEncoding)!)") } } } 

Я не эксперт JSON и не эксперт Swift, но для меня это работает. 🙂 Я извлек код из моего текущего приложения и только изменил «MyLog to println» и отступом с пробелами, чтобы он отображался как блок кода (надеюсь, я его не сломал).

 func getServerCourseVersion(){ Alamofire.request(.GET,"\(PUBLIC_URL)/vtcver.php") .responseJSON { (_,_, JSON, _) in if let jsonResult = JSON as? Array<Dictionary<String,String>> { let courseName = jsonResult[0]["courseName"] let courseVersion = jsonResult[0]["courseVersion"] let courseZipFile = jsonResult[0]["courseZipFile"] println("JSON: courseName: \(courseName)") println("JSON: courseVersion: \(courseVersion)") println("JSON: courseZipFile: \(courseZipFile)") } } } 

Надеюсь это поможет.

Редактировать:

Для справки, вот что возвращает мой PHP-скрипт:

 [{"courseName": "Training Title","courseVersion": "1.01","courseZipFile": "101/files.zip"}] 

быстрый 3

 pod 'Alamofire', '~> 4.4' pod 'SwiftyJSON' File json format: { "codeAd": { "dateExpire": "2017/12/11", "codeRemoveAd":"1231243134" } } import Alamofire import SwiftyJSON private func downloadJson() { Alamofire.request("https://yourlinkdownloadjson/abc").responseJSON { response in debugPrint(response) if let json = response.data { let data = JSON(data: json) print("data\(data["codeAd"]["dateExpire"])") print("data\(data["codeAd"]["codeRemoveAd"])") } } } 

Swift 3, Alamofire 4.4 и SwiftyJSON:

 Alamofire.request(url, method: .get) .responseJSON { response in if response.data != nil { let json = JSON(data: response.data!) let name = json["people"][0]["name"].string if name != nil { print(name!) } } } 

Это проанализирует этот вход JSON:

 { people: [ { name: 'John' }, { name: 'Dave' } ] } 

Я нашел способ конвертировать response.result.value (внутри закрытие ответа AlamofireJSON) в формат JSON, который я использую в своем приложении.

Я использую Alamofire 3 и Swift 2.2.

Вот код, который я использовал:

  Alamofire.request(.POST, requestString, parameters: parameters, encoding: .JSON, headers: headers).validate(statusCode: 200..<303) .validate(contentType: ["application/json"]) .responseJSON { (response) in NSLog("response = \(response)") switch response.result { case .Success: guard let resultValue = response.result.value else { NSLog("Result value in response is nil") completionHandler(response: nil) return } let responseJSON = JSON(resultValue) // I do any processing this function needs to do with the JSON here // Here I call a completionHandler I wrote for the success case break case .Failure(let error): NSLog("Error result: \(error)") // Here I call a completionHandler I wrote for the failure case return } 

Обычно я использую библиотеку Gloss для сериализации или десериализации JSON в iOS. Например, у меня JSON выглядит так:

 {"ABDC":[{"AB":"qwerty","CD":"uiop"}],[{"AB":"12334","CD":"asdf"}]} 

Во-первых, я моделирую массив JSON в структуре Gloss:

 Struct Struct_Name: Decodable { let IJ: String? let KL: String? init?(json: JSON){ self.IJ = "AB" <~~ json self.KL = "CD" <~~ json } } 

И затем в ответ Alamofire JSON, я делаю следующее:

 Alamofire.request(url, method: .get, paramters: parametersURL).validate(contentType: ["application/json"]).responseJSON{ response in switch response.result{ case .success (let data): guard let value = data as? JSON, let eventsArrayJSON = value["ABDC"] as? [JSON] else { fatalError() } let struct_name = [Struct_Name].from(jsonArray: eventsArrayJSON)//the JSON deserialization is done here, after this line you can do anything with your JSON for i in 0 ..< Int((struct_name?.count)!) { print((struct_name?[i].IJ!)!) print((struct_name?[i].KL!)!) } break case .failure(let error): print("Error: \(error)") break } } 

Вывод из приведенного выше кода:

 qwerty uiop 1234 asdf 
  pod 'Alamofire' pod 'SwiftyJSON' pod 'ReachabilitySwift' import UIKit import Alamofire import SwiftyJSON import SystemConfiguration class WebServiceHelper: NSObject { typealias SuccessHandler = (JSON) -> Void typealias FailureHandler = (Error) -> Void // MARK: - Internet Connectivity class func isConnectedToNetwork() -> Bool { var zeroAddress = sockaddr_in() zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size) zeroAddress.sin_family = sa_family_t(AF_INET) guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { SCNetworkReachabilityCreateWithAddress(nil, $0) } }) else { return false } var flags: SCNetworkReachabilityFlags = [] if !SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) { return false } let isReachable = flags.contains(.reachable) let needsConnection = flags.contains(.connectionRequired) return (isReachable && !needsConnection) } // MARK: - Helper Methods class func getWebServiceCall(_ strURL : String, isShowLoader : Bool, success : @escaping SuccessHandler, failure : @escaping FailureHandler) { if isConnectedToNetwork() { print(strURL) if isShowLoader == true { AppDelegate.getDelegate().showLoader() } Alamofire.request(strURL).responseJSON { (resObj) -> Void in print(resObj) if resObj.result.isSuccess { let resJson = JSON(resObj.result.value!) if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } debugPrint(resJson) success(resJson) } if resObj.result.isFailure { let error : Error = resObj.result.error! if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } debugPrint(error) failure(error) } } }else { CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!) } } class func getWebServiceCall(_ strURL : String, params : [String : AnyObject]?, isShowLoader : Bool, success : @escaping SuccessHandler, failure :@escaping FailureHandler){ if isConnectedToNetwork() { if isShowLoader == true { AppDelegate.getDelegate().showLoader() } Alamofire.request(strURL, method: .get, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON(completionHandler: {(resObj) -> Void in print(resObj) if resObj.result.isSuccess { let resJson = JSON(resObj.result.value!) if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } success(resJson) } if resObj.result.isFailure { let error : Error = resObj.result.error! if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } failure(error) } }) } else { CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!) } } class func postWebServiceCall(_ strURL : String, params : [String : AnyObject]?, isShowLoader : Bool, success : @escaping SuccessHandler, failure :@escaping FailureHandler) { if isConnectedToNetwork() { if isShowLoader == true { AppDelegate.getDelegate().showLoader() } Alamofire.request(strURL, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON(completionHandler: {(resObj) -> Void in print(resObj) if resObj.result.isSuccess { let resJson = JSON(resObj.result.value!) if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } success(resJson) } if resObj.result.isFailure { let error : Error = resObj.result.error! if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } failure(error) } }) }else { CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!) } } class func postWebServiceCallWithImage(_ strURL : String, image : UIImage!, strImageParam : String, params : [String : AnyObject]?, isShowLoader : Bool, success : @escaping SuccessHandler, failure : @escaping FailureHandler) { if isConnectedToNetwork() { if isShowLoader == true { AppDelegate.getDelegate().showLoader() } Alamofire.upload( multipartFormData: { multipartFormData in if let imageData = UIImageJPEGRepresentation(image, 0.5) { multipartFormData.append(imageData, withName: "Image.jpg") } for (key, value) in params! { let data = value as! String multipartFormData.append(data.data(using: String.Encoding.utf8)!, withName: key) print(multipartFormData) } }, to: strURL, encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.responseJSON { response in debugPrint(response) //let datastring = String(data: response, encoding: String.Encoding.utf8) // print(datastring) } case .failure(let encodingError): print(encodingError) if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } let error : NSError = encodingError as NSError failure(error) } switch encodingResult { case .success(let upload, _, _): upload.responseJSON { (response) -> Void in if response.result.isSuccess { let resJson = JSON(response.result.value!) if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } success(resJson) } if response.result.isFailure { let error : Error = response.result.error! as Error if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } failure(error) } } case .failure(let encodingError): if isShowLoader == true { AppDelegate.getDelegate().dismissLoader() } let error : NSError = encodingError as NSError failure(error) } } ) } else { CommonMethods.showAlertWithError("", strMessage: Messages.NO_NETWORK, withTarget: (AppDelegate.getDelegate().window!.rootViewController)!) } } } ================================== Call Method let aParams : [String : String] = [ "ReqCode" : Constants.kRequestCodeLogin, ] WebServiceHelper.postWebServiceCall(Constants.BaseURL, params: aParams as [String : AnyObject]?, isShowLoader: true, success: { (responceObj) in if "\(responceObj["RespCode"])" != "1" { let alert = UIAlertController(title: Constants.kAppName, message: "\(responceObj["RespMsg"])", preferredStyle: UIAlertControllerStyle.alert) let OKAction = UIAlertAction(title: "OK", style: .default) { (action:UIAlertAction!) in } alert.addAction(OKAction) self.present(alert, animated: true, completion: nil) } else { let aParams : [String : String] = [ "Password" : self.dictAddLogin[AddLoginConstants.kPassword]!, ] CommonMethods.saveCustomObject(aParams as AnyObject?, key: Constants.kLoginData) } }, failure: { (error) in CommonMethods.showAlertWithError(Constants.kALERT_TITLE_Error, strMessage: error.localizedDescription,withTarget: (AppDelegate.getDelegate().window!.rootViewController)!) }) } 
  • Swift SVG Fil Color для SVGImage
  • Как проверить, разрешено ли пользователю разрешение на использование камеры?
  • Swift - удаление пробелов из строки не работает
  • Изменение размера видео и сохранение шкалы 1: 1
  • Невозможно отклонить контроллер модального представления
  • Почему Array является AnyObject в Swift?
  • Facebook ShareDialog всегда возвращает .canceled по завершении
  • Swift - UIImagePickerController - как его использовать?
  • Swift TableView Crash: «Отсутствует ячейка для вновь видимой строки»
  • Как я могу декодировать объект, когда исходный класс недоступен?
  • как установить выбранную галочку как отмеченную в tableview ячейке swift 3.0
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.