如何在Swift 3中从webservice创buildJson响应的模型类

我是新来的迅速。 而我正在迅速的项目。 我得到如下所示的响应服务器响应

kNetworkManager.executePostRequest(urlString: kAppSocialLoginURL, params:mainDictionary, requestVC: self,completionHandler: {(responseObject) -> () in // print("response object:\(responseObject!)") if responseObject != nil { let responseDictionary = responseObject as! NSDictionary if responseDictionary is NSDictionary{ let obj = responseDictionary.value(forKey:"user") if obj is NSDictionary{ //success case print("NSDictionary is",obj ?? NSDictionary()) UtilityClass.sharedInstance.userDetailsDictionary = responseDictionary as! [String : AnyObject] if let obj = responseDictionary.value(forKey:"user") as? NSDictionary { if let sessionId = obj["token"] as? String { UtilityClass.sharedInstance.kSessionIDString = sessionId } if let userObj = obj["user"] as? NSDictionary { 

在上面的代码中,我正在多次检查其字典是否被指定为字典。 我在所有课上都做这种练习。 所以,我想为通用逻辑创build一些模态类,并且我想在得到Webservice数据之后使用这个逻辑的每个类。

而我的web服务响应如下

 user = { sessid = "-qadadadad"; "session_name" =aadadad; tokenData = adadadad; user = { access = 1513647; created = 14822; data = { "ckeditor_auto_lang" = t; "ckeditor_default" = t; "ckeditor_lang" = en; "ckeditor_show_toggle" = t; "ckeditor_width" = "100%"; contact = 1; }; 

我正在使用Alamofire进行API调用。

任何人都可以帮助我在这里,实现这一目标? 谢谢!

既然你在你的kNetworkManager中使用Alamofire,我会build议也使用AlamofireObjectMapper来摆脱parsing响应的麻烦,并把它映射到一个模型中:

Alamofire的扩展,它使用ObjectMapper将JSON响应数据自动转换为swift对象。

它很容易被集成,你可以检查它的文档来熟悉你如何做到这一点。

基于您提到的响应,可映射的对象应该类似于:

 import ObjectMapper class UserResponse: Mappable { var sessId: String? var sessionName: String? var tokenData: String? var user: User? required init?(map: Map) { } func mapping(map: Map) { sessId <- map["sessid"] sessionNamen <- map["session_name"] tokenData <- map["tokenData"] user <- map["user"] } } class User: Mappable { var access: Int? var created: Int? required init?(map: Map){ } func mapping(map: Map) { access <- map["day"] created <- map["access"] conditions <- map["created"] data <- map["data"] } } class UserData: Mappable { var ckEditorAutoLang: String? var ckEditorDefault: String? var ckEditorLang: String? var ckEditorShowToggle: String? var ckEditorWidth: String? var contact: Int? required init?(map: Map){ } func mapping(map: Map) { ckEditorAutoLang <- map["ckeditor_auto_lang"] ckEditorDefault <- map["ckeditor_default"] ckEditorLang <- map["ckeditor_lang"] ckEditorShowToggle <- map["ckeditor_show_toggle"] ckEditorWidth <- map["ckeditor_width"] contact <- map["contact"] } } 

另外,如果你使用的是Swift 4,你可能想看看Codable ,它应该让你的生活更轻松!

如果你使用Alamofire那么。 使用这个通用的方法

 //MARK:- Public Method /** * Initiates HTTPS or HTTP request over |kHTTPMethod| method and returns call back in success and failure block. * * @param serviceName name of the service * @param method method type like Get and Post * @param postData parameters * @param responeBlock call back in block */ func requestApi(serviceName: String, method: kHTTPMethod, postData: Dictionary<String, Any>, withProgressHUD showProgress: Bool, completionClosure:@escaping (_ result: Any?, _ error: Error?, _ errorType: ErrorType, _ statusCode: NSNumber?) -> ()) -> Void { if NetworkReachabilityManager()?.isReachable == true { if showProgress { showProgressHUD() } let headers = getHeaderWithAPIName(serviceName: serviceName) let serviceUrl = getServiceUrl(string: serviceName) let params = getPrintableParamsFromJson(postData: postData) print_debug(items: "Connecting to Host with URL \(kBASEURL)\(serviceName) with parameters: \(params)") print_debug(items: "###### \(postData) ######") //NSAssert Statements assert(method != .GET || method != .POST, "kHTTPMethod should be one of kHTTPMethodGET|kHTTPMethodPOST|kHTTPMethodPOSTMultiPart."); switch method { case .GET: Alamofire.request(serviceUrl, method: .get, parameters: postData, encoding: URLEncoding.default, headers: headers).responseJSON(completionHandler: { (DataResponse) in SVProgressHUD.dismiss() switch DataResponse.result { case .success(let JSON): print_debug_fake(items: "Success with JSON: \(JSON)") print_debug(items: "Success with status Code: \(String(describing: DataResponse.response?.statusCode))") let response = self.getResponseDataDictionaryFromData(data: DataResponse.data!) completionClosure(response.responseData, response.error, .requestSuccess, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) case .failure(let error): print_debug(items: "json error: \(error.localizedDescription)") if error.localizedDescription == "cancelled" { completionClosure(nil, error, .requestCancelled, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) } else { completionClosure(nil, error, .requestFailed, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) } } }) case .POST: Alamofire.request(serviceUrl, method: .post, parameters: postData, encoding: JSONEncoding.default, headers: headers).responseJSON(completionHandler: { (DataResponse) in SVProgressHUD.dismiss() switch DataResponse.result { case .success(let JSON): print_debug_fake(items: "Success with JSON: \(JSON)") print_debug(items: "Success with status Code: \(String(describing: DataResponse.response?.statusCode))") let response = self.getResponseDataDictionaryFromData(data: DataResponse.data!) completionClosure(response.responseData, response.error, .requestSuccess, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) case .failure(let error): print_debug(items: "json error: \(error.localizedDescription)") completionClosure(nil, error, .requestFailed, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) } }) case .PUT: Alamofire.request(serviceUrl, method: .put, parameters: postData, encoding: JSONEncoding.default, headers: headers).responseJSON(completionHandler: { (DataResponse) in SVProgressHUD.dismiss() switch DataResponse.result { case .success(let JSON): print_debug_fake(items: "Success with JSON: \(JSON)") print_debug(items: "Success with status Code: \(String(describing: DataResponse.response?.statusCode))") let response = self.getResponseDataDictionaryFromData(data: DataResponse.data!) completionClosure(response.responseData, response.error, .requestSuccess, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) case .failure(let error): print_debug(items: "json error: \(error.localizedDescription)") completionClosure(nil, error, .requestFailed, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) } }) case .PATCH: Alamofire.request(serviceUrl, method: .patch, parameters: postData, encoding: JSONEncoding.default, headers: headers).responseJSON(completionHandler: { (DataResponse) in SVProgressHUD.dismiss() switch DataResponse.result { case .success(let JSON): print_debug_fake(items: "Success with JSON: \(JSON)") print_debug(items: "Success with status Code: \(String(describing: DataResponse.response?.statusCode))") let response = self.getResponseDataDictionaryFromData(data: DataResponse.data!) completionClosure(response.responseData, response.error, .requestSuccess, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) case .failure(let error): print_debug(items: "json error: \(error.localizedDescription)") completionClosure(nil, error, .requestFailed, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) } }) case .DELETE: Alamofire.request(serviceUrl, method: .delete, parameters: postData, encoding: URLEncoding.default, headers: headers).responseJSON(completionHandler: { (DataResponse) in SVProgressHUD.dismiss() switch DataResponse.result { case .success(let JSON): print_debug_fake(items: "Success with JSON: \(JSON)") print_debug(items: "Success with status Code: \(String(describing: DataResponse.response?.statusCode))") let response = self.getResponseDataDictionaryFromData(data: DataResponse.data!) completionClosure(response.responseData, response.error, .requestSuccess, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) case .failure(let error): print_debug(items: "json error: \(error.localizedDescription)") completionClosure(nil, error, .requestFailed, NSNumber.getNSNumber(message: DataResponse.response?.statusCode)) } }) } } else { SVProgressHUD.dismiss() completionClosure(nil, nil, .noNetwork, nil) } } 

请根据你调整这个方法,因为我直接复制这个方法在我的networking公共类