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

时间:2015-10-10 16:41:02

标签: ios json swift2 nsurlsession

正在寻找有关Swift 2和iOS 9网络的有用教程,但似乎主题没有在线内容。我已经看过WWDC会话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类用于网络和解析可能是ORM吗?

2 个答案:

答案 0 :(得分:9)

向您提出请求的简便方法:

How to make an HTTP request in Swift?

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

HTTP POST error Handling in Swift 2

将字符串转换为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
    }
}

}

答案 1 :(得分:1)

哦,好吧......搜索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)