将 json 和 HTTP“post”代码转换为 Swift 3 时出错

Posted

技术标签:

【中文标题】将 json 和 HTTP“post”代码转换为 Swift 3 时出错【英文标题】:Errors while converting json and HTTP "post" code to Swift 3 【发布时间】:2016-11-04 09:27:48 【问题描述】:

我正在尝试将旧代码从教程转换为 Swift 3,因为我目前正在处理的项目已经在 Swift 3 中。我在发送 POST 请求和读取收到的 JSON 时遇到问题。请注意,这些屏幕截图是从视频中截取的,因此某些代码可能会重复。

我的代码如下:

let myURL = NSURL(string:"http://localhost/bahApp/scripts/registerUser.php?");
    let request = NSMutableURLRequest(url:myURL as! URL)
    request.httpMethod = "POST";
    let postString = "userEmail=\(userEmail)&userPassword=\(userPassword)&userFirstName=\(userFirstName)&userLastName=\(userLastName)&numberOfConnections=\(numberOfConnections)&installerID=\(installerID)"
    request.httpBody = postString.data(using: String.Encoding.utf8);

    let task = URLSession.shared.dataTask(with: myURL as URL!)  data, response, error in
        DispatchQueue.main.async 
            if error != nil
            self.displayAlertMessage(userMessage: (error?.localizedDescription)!)
                return
            
            do 
                if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any]
                print(jsonResult)

             catch let error as NSError 
                print(error.localizedDescription)
            

             let parseJSON = jsonResult as? NSDictionary 

                var userId = parseJSON["userID"] as? String

             if (userId != nil)
                var myAlert = UIAlertController(title: "Alert", message: "registration successful", preferredStyle: UIAlertControllerStyle.alert)
                let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
                myAlert.addAction(okAction);
                self.present(myAlert, animated: true, completion: nil)
             else
                let errorMessage = parseJSON["message"] as? String
                if (errorMessage != nil)
                self.displayAlertMessage(userMessage: errorMessage!)
                
                
            
        
    
    task.resume()


func displayAlertMessage(userMessage: String)

    var myAlert = UIAlertController(title: "Alert", message: userMessage, preferredStyle: UIAlertControllerStyle.alert)
    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
    myAlert.addAction(okAction);
    self.present(myAlert, animated: true, completion: nil)

我想知道我是否正确转换了大部分代码以及如何修复如下屏幕截图所示的错误:

我对此进行了广泛的搜索,唯一能有所帮助的帖子是this post

【问题讨论】:

"let parseJSON = jsonResult as?NSDictionary " 不是有效的 Swift 代码,尝试将其更改为 "if let parseJSON = jsonResult as?NSDictionary " @sealos 谢谢,当我将其更改为它时,它会给出错误“使用未解析的标识符'jsonResult'” jsonResult 声明位于 do 块内。请给我一分钟时间来编写修复程序。 【参考方案1】:

您的代码正在尝试使用在范围外访问的实例。这是由于 do 块内的声明而发生的。试试下面的代码:

let task = URLSession.shared.dataTask(with: myURL as URL!)  data, response, error in
    DispatchQueue.main.async 
        if let error = error 
            self.displayAlertMessage(userMessage:(error.localizedDescription)!)
            return
        

        let jsonResult: [String:Any]?
        do 
            jsonResult = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any]
            if let result = jsonResult 
                print(result)
            

         catch let error as NSError 
            print(error.localizedDescription)
        

        if let parseJSON = jsonResult as? NSDictionary 

            if let userId = parseJSON["userID"] as? String 
                var myAlert = UIAlertController(title: "Alert", message: "registration successful", preferredStyle: UIAlertControllerStyle.alert)
                let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)
                myAlert.addAction(okAction);
                self.present(myAlert, animated: true, completion: nil)
             else 
                if let errorMessage = parseJSON["message"] as? String
                    self.displayAlertMessage(userMessage: errorMessage!)
                
            
        
    

【讨论】:

【参考方案2】:

您忘记在let parseJSON 之前添加if

if let parseJSON = jsonResult as? NSDictionary 
  //...

【讨论】:

我有你说的,当我改变它时,它给出了错误“使用未解析的标识符'jsonResult'” 你应该把这段代码移到包含if let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? [String:Any] print(jsonResult)的行下面 帮助很大,谢谢你,我赞成,但因为我低于 15 代表它不显示

以上是关于将 json 和 HTTP“post”代码转换为 Swift 3 时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 转换为 Swift Dictionary 以进行 HTTP POST

如何将字典列表转换为 JSON

如何在 Django 中将 Http Post 参数的 Json 值转换为 Python 字典?

使用 jQuery 发布 JSON 后,将字符串转换回 JSON

@ResponseBody将集合数据转换为json格式并返回给客户端

DJANGO - 将 POST 数据转换为 JSON 并部分呈现 HTML