Swift:使用Alamofire和SwiftyJSON处理JSON

这肯定会被问过几次,但我还没有找到正确的答案,尽管我一直很努力。

我使用Alamofire和SwiftyJSON,我的JSON数据看起来像这样:

{ "528" : { "name" : "Name 1", "id" : "528", "product_id" : null, "visible" : "0", "level" : "2" }, "29" : { "name" : "Name 2", "id" : "29", "product_id" : null, "visible" : "1", "level" : "1" }, "173" : { "name" : "Name 3", "id" : "173", "product_id" : null, "visible" : "0", "level" : "2" }, "143" : { "name" : "Name 4", "id" : "143", "product_id" : null, "visible" : "1", "level" : "2" }, 

…使用此代码:

 Alamofire.request(.GET, dataURL, parameters: nil, encoding: .JSON) .responseJSON { (request, response, jsonData, error) in let json = JSON(jsonData!) println(json) } 

…所以JSON一切都应该没问题

  1. 我如何访问该数据? 我的意思是我如何获得名称,ID,product_ids等

  2. 我怎样才能将这些数据(名称)放到我的TableViewController中?

我在我的一个项目中使用了SwiftyJSON和Alamofire。 这是我如何使用它。

  1. 创建一个名为APIProtocol的协议。
  2. 使用GET方法设置API类,该方法接受APIProtocol类型的委托。
  3. 设置TableViewController以实现APIProtocol。
  4. 从TableViewController调用API.get()

 // Step 1 protocol APIProtocol { func didReceiveResult(results: JSON) } // Step 2 func get(path: String, parameters: [String: AnyObject]? = nil, delegate: APIProtocol? = nil){ let url = "\(self.hostname)\(path)" NSLog("Preparing for GET request to: \(url)") Alamofire.request(.GET, url, parameters: parameters) .responseJSON { (req, res, json, error) in if(error != nil) { NSLog("GET Error: \(error)") println(res) } else { var json = JSON(json!) NSLog("GET Result: \(json)") // Call delegate if it was passed into the call if(delegate != nil) { delegate!.didReceiveResult(json) } } } } // Step 3 class ActivityViewController: UITableViewController, APIProtocol { var activityModelList: NSMutableArray = [] // This is the array that my tableView is using. ... func didReceiveResult(result: JSON) { var activities: NSMutableArray = [] NSLog("Activity.didReceiveResult: \(result)") for (index: String, activity: JSON) in result { var activityModel = ActivityModel( id: activity["id"].intValue, message: activity["message"].stringValue ) activities.addObject(activityModel) } // Set our array of new models activityModelList = activities // Make sure we are on the main thread, and update the UI. dispatch_sync(dispatch_get_main_queue(), { self.refreshControl!.endRefreshing() self.tableView.reloadData() }) } } // Step 4 override func viewDidLoad() { MyAPI.get("/activities", delegate: self) } 

访问器(至少对于SwiftyJSON)的工作方式如下:

 if let userName = json[0]["528"]["name"].string{ println(userName) // "Name 1" } 

有关如何使用SwiftyJSOn的更多信息,请参见官方文档: https : //github.com/SwiftyJSON/SwiftyJSON

关于如何将数据放入UITableView,有很多方法。 设置一个UITableView单元格,然后加载某种数组中的JSON数据。

查看此repo以获取一个示例,该示例声明如何在代码中使用Alamofire以及如何使用swift创建模型并解析JSON响应

  1. 在您的项目中安装Alamofire
  2. 在您的class级中导入Alamofire
  3. 在您的类中定义这些变量

     typealias complitionBlock = (data: AnyObject) -> Void let KBASE_URL: String = "http://static.westwing.de/cms/dont-delete/programming_task/data.json" 
  4. 设置此function的实现

     func getMainItems(complition block: complitionBlock) { Alamofire.request(.GET, KBASE_URL, parameters:nil).responseJSON { response in do { let items = try NSJSONSerialization.JSONObjectWithData(response.data!, options: NSJSONReadingOptions()) as! NSArray let mutableArray: NSMutableArray = [] items.enumerateObjectsUsingBlock({ object, index, stop in let str = object as! NSDictionary //Replace WESItem with your model //let item = WESItem(dictionary: str as NSDictionary) mutableArray.addObject(item) }) block(data: mutableArray) } catch { print(error) } } } 

有关更多信息,请访问: https : //github.com/AhmedAskar/WestWing

以下应该适合你: –

  var nameArr = [String]() Alamofire.request(.GET,"your url", parameters: nil) .validate().responseJSON { response in if let responseJson = response.result.value { let name = responseJson["name"] as! String nameArr.append(name) } dispatch_async(dispatch_get_main_queue(), { self.tableView.reloadData() }) }// Alamofire Close Use tableview as you normally use it ie func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var cell = tableView.dequeueReusableCellWithIdentifier("cell") if cell == nil { cell = UITableViewCell(style: .Default, reuseIdentifier: "cell") } cell!.textLabel?.text = nameArr[indexPath.row] return cell! } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return nameArr.count } 

注意:不需要使用Swifty JSON,因为Alamofire允许JSON响应,可以在“.responseJSON”中直接处理。

 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.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)!) } } } ================================== 

呼叫方法

让aParams:[String:String] = [“DeviceIDString”,“DeviceType”:“iOS”,]

  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)!) }) }