Swift 2,解析 JSON,空响应

Posted

技术标签:

【中文标题】Swift 2,解析 JSON,空响应【英文标题】:Swift 2, Parsing JSON, empty response 【发布时间】:2016-03-10 04:09:13 【问题描述】:

我最近使用 php 和 AJAX 制作了一个基于 Web 的单屏应用程序。我想将这个应用程序移植到 ios,并开始自学 Swift。我让应用程序在 Swift 1 中完美运行,但由于我更新到 xCode 7.2 和 Swift 2,以便我可以在装有 iOS 9 的 iPhone 上试用该应用程序,因此代码完全不起作用。从这里开始,我现在有了新代码,据我所知,它应该可以工作,但我得到的响应是空的。怎么了?

import UIKit
import Foundation

class LoginViewController: UIViewController, UITextFieldDelegate 



    @IBOutlet weak var username_textField: UITextField!

    @IBOutlet weak var password_TextFieldOutlet: UITextField!


    @IBAction func password_TextFieldAction(sender: AnyObject) 


        let username = username_textField.text
        let password = password_TextFieldOutlet.text
        var urlRequest = "~~URL~~/login.php?username=\(username)&password=\(password)"



    


    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    



我的想法是从数据库中获取我的数据并查看“成功”(数据库中的布尔值)是否返回 1 或 0。如果返回 1,则执行转到下一页,如果不是,创建一个提示用户名和密码不正确的警报。

提前谢谢你!

【问题讨论】:

但是你的代码没有这样做!!它只是初始化变量。 @CnchalRaj 我明白,我找不到解决方案来让它工作 - 我是说我不明白如何从 URL 中检索 json 数据 你的password_TextFieldAction 是什么?是单击按钮还是在 textField 上进行修饰 == 给你:***.com/questions/24016142/… @Lee 这是文本字段在退出时结束时的操作 【参考方案1】:

    创建网址

    let url = NSURL(string: "http://google.com")

    创建请求

    let request = NSMutableUrlRequest(url: url!)

    添加数据和请求方法

    request.HTTPMethod = "POST" request.HTTPBody = "username=\(username text.text!)".dataUsingEncoding(NSUTF8StringEncoding)

    发送连接

      NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue())  
         (response, data, error) -> Void in
     if data != nil && error == nil 
         if let response = String(data: data!, encoding: NSUTF8StringEncoding)  
              //here is where you now have your response 
         
     )
    

【讨论】:

建议使用 NSURLSession 而不是 NSURLConnection。 @ryantxr 虽然从 php 文件发送的编码是 JSON【参考方案2】:

对网络请求使用 NSURLConnectionDelegateAFNetworking。以下是使用NSURLConnection 的实现。

我已经为你实现了LoginViewController 类。 将以下 loginButtonAction 挂钩到 UI 上的“登录/登录/完成”按钮。

import UIKit
import Foundation
class LoginViewController: UIViewController, NSURLConnectionDelegate 
@IBOutlet weak var username_textField: UITextField!
@IBOutlet weak var password_TextFieldOutlet: UITextField!
@lazy var data = NSMutableData()

override func viewDidLoad() 
    super.viewDidLoad()


override func viewWillAppear(animated: Bool) 
    super.viewWillAppear(animated)
    startConnection()


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


func startConnection()
let username = username_textField.text
    let password = password_TextFieldOutlet.text
    let urlPath: String = "~~URL~~/login.php?username=\(username)&password=\(password)"
    var url: NSURL = NSURL(string: urlPath)
    var request: NSURLRequest = NSURLRequest(URL: url)
    var connection: NSURLConnection = NSURLConnection(request: request, delegate: self, startImmediately: false)
    connection.start()


func connection(connection: NSURLConnection!, didReceiveData data: NSData!)
    self.data.appendData(data)


func loginButtonAction(sender: UIButton!)
    startConnection()


func connectionDidFinishLoading(connection: NSURLConnection!) 
    var err: NSError
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
//Here I am printing the results, you can check the results and based on response Bool you can perform segue to next view controller.
    println(jsonResult)



【讨论】:

您可以将您的代码发送到 rajchanchalkhatri@gmail.com 吗?让我为你修好它。

以上是关于Swift 2,解析 JSON,空响应的主要内容,如果未能解决你的问题,请参考以下文章

(Swift)如何解析有时包含某个字段的 JSON 响应?

改造解析JSON响应空值Android

保存 json 响应并将其解析为 swift 对象

使用 Codable 解析 JSON 响应会在 swift 中出现错误

iOS Swift 解析来自 Alamofire 的 JSON 响应

如何在 Swift 中解析来自 Alamofire API 的 JSON 响应?