如何使用 Swift 2 + XCode 7 + iOS 9 获取和解析 JSON

How To Fetch and Parse JSON Using Swift 2 + XCode 7 + iOS 9

想找Swift2和iOS9联网有用的教程,网上好像没有相关内容。我看过 WWDC session Networking with NSURLSession 但我无法调整 iOS9 的新 API 以异步方式获取和解析 JSON 数据.我尝试过的:

    do {
        if let url = NSURL(string: "site/api.php?option=fetchOps"),
            let data = NSData(contentsOfURL: url),
            let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [[String:AnyObject]] {

        }
    } catch let error as NSError {
        print(error.description)
    }

请在 iOS9 和 Swift2 上分享您的网络经验,任何最佳实践可能是 Singleton class 网络和解析可能是 ORM?

为您提出请求的简单方法:

或者如果您想自己发送请求:

将字符串转换为 JSON 对象:

举个例子,这里我转换了一个NSString

首先将 NSString 转换为 NSDictionary

static func convert(src: NSString) -> NSDictionary {
    // convert String to NSData
    let data = src.dataUsingEncoding(NSUTF8StringEncoding)
    var error: NSError?

    // convert NSData to 'AnyObject'
    let anyObj: AnyObject?
    do {
        anyObj = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions(rawValue: 0))
    } catch let error1 as NSError {
        error = error1
        anyObj = nil
    }

    if(error != nil) {
        // If there is an error parsing JSON, print it to the console
        print("JSON Error \(error!.localizedDescription)")
        //self.showError()
        return NSDictionary()
    } else {

        return anyObj as! NSDictionary
    }

}

然后,像这样使用它

if  let name = dictionary["name"] as? String {
    self.name = name
}

你可以使用转换后的JSON来制作这样的对象

import Foundation

class Student {
var name="";

init(dictionary: NSDictionary) {
    let _NAME = "name"
    if  let name = dictionary[_NAME] as? String {
        self.name = name
    }
}

}

oha,嗯...搜索 swift 的异步网络调用。你会发现很多东西。

但是是的...创建一个 NSMutableRequest,初始化 URL,将方法设置为 GET 或 POST。

现在制作:

let task = NSURLSession.sharedSession().dataTaskWithRequest(yourMutableRequest) { 
data, response, error in 
// do your stuff here

}
task.resume()

这将运行异步,因此您需要考虑一种处理数据的方法。首先,您的响应数据位于变量 data 中,这是一种 NSData。您将需要它来创建您的字典:

let dictionaryOrArray = NSJSONSerialization.JSONObjectWithData(data, options:.MutableContainers, error: nil)

也许你需要把它放在一个守卫中或者如果让声明。

现在您需要将数据传递给函数调用者...您可以通过多种方式做到这一点,我更喜欢成功和失败块 您调用 Request 函数并提供成功和失败块。这个块将完成最终应该发生的事情:

    let successBlock:[AnyObject]->Void = { response in 
     // handle your dict
    }

    let failureBlock:NSError->Void = { error in 
    // error handling
    }

    YourClass.fetchSomething(someURL, parameters: params, requestMethod: method, success : successBlock, failure: failureBlock)

类似的东西。在包含数据、响应、错误的请求块中,您只需执行以下操作:

If error {
    failure(error)
    return
}

success(dictionaryOrArray)