JSON数据无法在swift3中使用Alamofire进行解析

时间:2018-01-10 06:09:29

标签: ios json swift alamofire

我必须使用alamofire解析json 在使用json session之前,它正常工作从json获取数据。现在我尝试使用alamofire解析json。 这是使用json解析json的代码,这段代码工作正常

func auth(_ email:String,password:String) {

     var request = URLRequest(url:AppConstants.apiURLWithPathComponents("usersignin"))
        let session = URLSession.shared

        request.httpMethod = "POST"

        let bodyData = "email=\(email)&passCode=\(password)&deviceType=iOS&deviceId=\(deviceToken)"

        request.httpBody = bodyData.data(using: String.Encoding.utf8);
        let task = session.dataTask(with: request, completionHandler: { (data, response, error) in

            do {

                if data != nil {

                    if let jsonData = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary {

                        errorCode = String(describing: jsonData["errorCode"]!)

                        msg = jsonData["msg"] as! String

                        print(errorCode)

                        print(jsonData)

                        if(errorCode == "1"){

                            DispatchQueue.main.async(execute: {

                                self.activityIndicator.stopAnimating()

                            })

                        } else {

                            self.name = jsonData.value(forKey: "name") as! String

                            if let kidsURLDetails = jsonData["kidsURLDetails"] as? NSArray {

                                for i in 0 ..< kidsURLDetails.count {

                                    if kidsURLDetails[i] is NSDictionary {

                                        let url = kidsURLDetails[i] as? NSDictionary

                                        self.urls.append((url?["url"]) as! String)
                                    }
                                }
                            }

                            self.serverURL = self.urls.joined(separator: ",")
                            print("ServerURL \(self.serverURL)")
                            let prefs:UserDefaults = UserDefaults.standard
                            prefs.setValue(self.name, forKey: "NAME")

                            DispatchQueue.main.async(execute: {
                                UIApplication.shared.endIgnoringInteractionEvents()
                                let controllerId = "NavID"
                                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                                let initViewController: UIViewController = storyboard.instantiateViewController(withIdentifier: controllerId) as UIViewController
                                self.present(initViewController, animated: true, completion: nil)

                            })
                        }
                    }
                } else {

                }

            } catch let err as NSError {

                print("JSON Error \(err)")
            }

        })

        task.resume()
    }

在上面的代码我使用post方法传递参数,当我尝试使用参数传递almofire的post方法时出现错误“额外参数'方法'在调用中”,用户名和密码来自textfield所以输入电子邮件和密码后我用post方法传递了参数。

这是我将在alamofire json parse中实现的代码

 var request = URLRequest(url:AppConstants.apiURLWithPathComponents("usersignin"))


        let bodyData = "email=\(username)&passCode=\(passcode)&deviceType=iOS&deviceId=123456"

        let deviceId = "1234"

        let params: [String: Any] = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]
        Alamofire.request(request, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil)
            .responseJSON { response in

                print(response.result.value as Any)  }

如果我可以尝试使用此代码

Alamofire.request("http://www.kids.com/rk/api/usersignin?email=demo@kidsapp.com&passCode=123456&deviceType=&deviceId=", method: .post, parameters: nil, encoding: JSONEncoding.default, headers: nil)
            .responseJSON { response in

                print(response.result.value as Any)          }

如何解析使用alamofire传递参数的json post方法。在哪里我犯了错误请帮助我

3 个答案:

答案 0 :(得分:1)

你在1个参数中传递了错误的类型,它应该是URLConvertible(字符串或URL)而不是URLRequest。尝试以下代码。

let params: [String: Any] = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]
let url = URL(string: "http://www.kids.com/rk/api/usersignin")!
Alamofire.request(url, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil)
    .responseJSON { response in

}

____________编辑___________

此处标头是发布请求标头(如果有)或nil

let params: [String: Any] = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]

let urlString = "http://www.kids.com/rk/api/usersignin"
guard let url = URL(string: urlString), var request = try? URLRequest(url: url, method: .post, headers: header) else{
    //
    return
}

request.httpBody = params.map{ "\($0)=\($1)" }.joined(separator: "&").data(using: .utf8)
Alamofire.request(request).responseJSON { response in

}

答案 1 :(得分:0)

如果您需要使用发布请求在网址中发送参数,则应使用URLEncoding.default编码而不是JSONEncoding.default。当您需要将JSON数据作为内容类型为application/json的正文发送时,将使用JSONEncoding。

更改您的代码,如:

Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.default, headers: nil).responseJSON { response in
    print(response.result.value as Any)  
}

或者您可以删除编码参数,因为URLEncoding是Alamofire的默认编码。

答案 2 :(得分:0)

 // URL
    let urlString = “URL_Here”

    var params = [String: Any]()

    //Contruct your params
    params = ["email": username, "passCode": passwordstring, "deviceType": "IOS","deviceId":deviceId]

    // Request
    Alamofire.request(urlString, method: .post, parameters: params, encoding: JSONEncoding.default, headers: nil)
        .validate(statusCode: 200..<300)
        .responseJSON { response in
            if (response.result.error == nil) {
              let value = response.result.value
                print(value)
            }
            else {
                let errorString = response.result.error
                print(errorString)
            }
    }