为什么会出现错误Code = 3840 Parsing JSON?

Nat*_*kle 5 api json ios strongloop swift

一般来说,我是Swift和iOS开发的新手。我正在测试和学习如何使用远程服务器api。尝试进行身份验证时,我从Strongloop(Loopback)api中获取了JSON,而我尝试使用的解析过程出错:

错误域= NSCocoaErrorDomain代码= 3840“无法完成操作。(可可错误3840。)”(无值。)UserInfo = 0x7fd623e38870 {NSDebugDescription =无值。}

这是字符串中的返回值,很明显,我从Loopback,身份验证令牌,ttl,date和userId获得了正确的JSON响应:

{“ id”:“ BHzKnjrbUPn9KSC1GegQTNHJFNwfuifNXPfZuKkYxC5IwRDEHuerurvSdBMzzrVi”,“ ttl”:1209600,“ created”:“” 2015-07-03T13:04:39.791Z“,” userId“:2}

我认为实际问题不是在parseJSON方法中发生,而是在performLoginRequestWithURL方法中发生。它返回一个空字符串。与异步请求有关。我注意到json字符串变量直到从方法返回后才被设置,因此返回空白。如果我放置了两个println(json)方法,一个在异步请求中,另一个在它之后,然后一个在先打印。从某种意义上讲这很有意义,但我不知道如何解决。我需要从帖子中返回json,但我不知道如何捕获。告诉我我需要使用同步请求,但是在从POST请求获取json的情况下,我不知道该怎么做。

这是我的代码:

//Login button pressed
@IBAction func login() {
    //Gets url string
    let url = getLogin()
    //Posts url with UITextField data.
    if let jsonString = performLoginRequestWithURL(url) {
        //Error occurs in the parseJSON method
        if let dictionary = parseJSON(jsonString) {
            /*
            if let at = dictionary["id"] as? String {
                accesstoken = at
            }
            if let id = dictionary["userId"] as? Int {
                println(id)
            }
            */
        }
    }

}

func getLogin() -> NSURL {
    let toEscape = "http://localhost:3000/api/Users/login"
    let urlString = toEscape.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)!
    let url = NSURL(string: urlString)
    return url!
}

func performLoginRequestWithURL(url: NSURL) -> String? {
    let bodyData = "username=\(textEmail.text)&password=\(textPW.text)"
    var request: NSMutableURLRequest = NSMutableURLRequest(URL: url)
    var json = ""
    request.HTTPMethod = "POST"
    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding)
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()){
        response, data, error in

        if data != nil {
            json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
        }
        println(json)
    }
    return json
}

func parseJSON(jsonString: String) -> [String: AnyObject]? {
    if let data = jsonString.dataUsingEncoding(NSUTF8StringEncoding) {
        var error: NSError?
        if let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(0), error: &error) as? [String: AnyObject] {
            return json
        } else if let error = error {
            //Here's where the error comes back.
            println("JSON Error: \(error)")
        } else {
            println("Unknown JSON Error")
        }
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

zap*_*aph 2

parseJSON方法必须从完成块调用NSURLConnection.sendAsynchronousRequest,而不是在发出异步请求之后调用,此时通常还没有响应。

if data != nil {
    json = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
    println("json: \(json)")

    if let dictionary = parseJSON(jsonString) {
        println("dictionary: \(dictionary)")
   }
}
Run Code Online (Sandbox Code Playgroud)