【问题标题】:How to parse this specific JSON data in Swift 2.0如何在 Swift 2.0 中解析这个特定的 JSON 数据
【发布时间】:2015-09-30 21:29:55
【问题描述】:

我正在尝试从 API 解析 Json 数据:

{
    "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()
    }
}

当我使用上面的代码时,我在'if let jsonArray = JsonData' 行前面收到错误'条件绑定的初始化程序必须具有可选类型,而不是'AnyObject''。我尝试了一些我在 StackOverflow 上看到的方法,比如链接中的方法: [Parsing JSON in swift 2.0 但这对我不起作用。我对 Swift 还是有点陌生​​,我真的不想使用 SwiftyJSON。这是解析此 JSON 数据的最佳方式还是有更好的方式?

【问题讨论】:

  • 愿意分享导致错误的语句吗?
  • 提示:在 Xcode 中,您可以通过选择代码和 control-i 来重新缩进代码。良好的缩进可以使代码更容易理解。
  • 就是这样: if let jsonArray = JSONData { for j in jsonArray { let title = jsonResult["title"] as!字符串 ....}
  • 感谢缩进提示

标签: json swift api parsing swift2


【解决方案1】:

由于您已将 NSJSONSerialization 与 try! 一起使用 (注意 !,这意味着它是强制的) JSONData 的值不是可选的:您不必解包它与if let jsonArray = JSONData.

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

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

【讨论】:

    【解决方案2】:

    JSONData 的类型未知,需要知道它是一个 Array 用于后面的 for 循环。

    使用:

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

    你不需要:

    if let jsonArray = JSONData {
    

    因为如果前面try!中的JSONData为nil,你已经崩溃了

    你会更好:

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

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

    也确实花点时间命名变量,JSONData不是数据,是解析JSON字符串得到的数组。

    【讨论】:

    • 我尝试使用您显示的代码,但由于某些奇怪的原因,“for j in jsonArray”行出现错误“使用未解析的标识符 'jsonArray'”。奇怪,因为我知道在它上面的行中 jsonArray 被赋予了一个值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多