如何在Swift 2.0中解析这个特定的JSON数据

时间:2015-09-30 21:29:55

标签: json swift api parsing swift2

我试图从API解析Json Data:

{
    "title": "Mr. Robot",
    "first_aired": "2015-06-24",
    "network": "USA Network",
    "channels": [
        {
            "id": 12,
            "name": "USA",
            "short_name": "usa",
            "channel_type": "television"
 }
    ],

我使用的代码是:

    var TVArray : [TVInfo] = []

    var task : NSURLSessionTask?


    func getJSON (urlString: String) {

        let url = NSURL(string: urlString)!
        let session = NSURLSession.sharedSession()
        task = session.dataTaskWithURL(url) {(data, response, error) in
            dispatch_async(dispatch_get_main_queue()) {
                if (error == nil) {
                    self.updateJSON(data)
                }
                else {

                }
            }
        }
        task!.resume()
    }


    func updateJSON (data: NSData!) {

        let JSONData = (try! NSJSONSerialization.JSONObjectWithData(data, options: []))

        TVArray.removeAll(keepCapacity: true)

        if let jsonArray = JSONData {
            for j in jsonArray {
                let title = jsonResult["title"] as! String
                let firstAired = jsonResult["first_aired"] as! String
                let network = jsonResult["network"] as! String
                let channelName = JsonResult["channels"][0]["name"] as! String

                let TV = TVInfo(title: title, firstAired: firstAired, network: network,    channelName: channelName)

                TVArray.append(TV)
            }
        }

        collectionview.reloadData()
    }
}

当我使用上面的代码时,我得到一个错误'条件绑定的初始化程序必须具有可选类型,而不是' AnyObject''在行前面如果让jsonArray = JsonData'。我已尝试过一些我在StackOverflow上看到过的方法,就像链接中的方法一样: [Parsing JSON in swift 2.0 但它对我没有用。我对Swift还有点新意,我真的不想使用SwiftyJSON。这是解析此JSON数据的最佳方法还是有更好的方法来实现它?

2 个答案:

答案 0 :(得分:0)

由于您已将NSJSONSerialization与try! 一起使用(请注意!,意味着它已被强制执行) JSONData的值不是可选的:你不必用if let jsonArray = JSONData打开它。

如果您仍想要可选值,请改用try?

否则您也可以在try块中使用do catch来处理可能的错误。

答案 1 :(得分:0)

JSONData的类型未知,需要知道它是以下for循环的数组。

使用:

let JSONData = try! NSJSONSerialization.JSONObjectWithData(data!, options:[]) as! NSArray

您不需要:

if let jsonArray = JSONData {

因为如果JSONData是前一个try!

的nil,你已经崩溃了

你最好用:

do {
    let jsonArray = try NSJSONSerialization.JSONObjectWithData(data!, options:[]) as! NSArray
    for j in jsonArray {
        // ...
    }
} catch {
    // handle error
}

因为你无法控制你收到的JSON并因服务器更改而崩溃不是一个好主意。

同样真正花了一些时间来命名变量,JSONData不是数据,它是通过解析JSON字符串获得的数组。