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

如何使用Swift 2+获取和解析JSON;XCode 7+;iOS 9,ios,json,swift2,nsurlsession,Ios,Json,Swift2,Nsurlsession,我们正在寻找有关Swift 2和iOS 9联网的有用教程,但该主题似乎没有在线内容。我已经观看了WWDC会话,但我无法调整iOS9的新API,使其具有获取和解析JSON数据的异步方式。我所尝试的: do { if let url = NSURL(string: "site/api.php?option=fetchOps"), let data = NSData(contentsOfURL: url), let jsonRes

我们正在寻找有关Swift 2和iOS 9联网的有用教程,但该主题似乎没有在线内容。我已经观看了WWDC会话,但我无法调整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上联网的经验,任何最佳做法可能是用于联网和解析的单例类,也可能是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
}
import Foundation

class Student {
var name="";

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

}
您可以使用转换后的JSON生成如下对象

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

class Student {
var name="";

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

}

哦,嗯。。。搜索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)
也许你需要把它放在一个守卫里,或者让他来

现在您需要将数据传递给函数调用方。。。你可以在很多方面做到这一点,我更喜欢成功和失败 调用请求函数并提供成功和失败块。这个模块将完成最终应该发生的事情:

    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)

1.您的URL无效。2.您正在同步获取它。改用NSURLSession。在SO或其他网站上有大量的Q&A。解决方案在哪里[要在swift2.0中使用NSURLSession解析JSON)异步?是的。@Eric。如果我想以块回调的形式获得结果,该怎么办?如何更改重复建议中所述的解决方案PO为什么要使用第三方库来完成简单的数据任务?如果你想自己完成,请参见以下内容::编辑了我的答案。