尝试从 Swift 2.0 中的 json 解析数据时出错?

Posted

技术标签:

【中文标题】尝试从 Swift 2.0 中的 json 解析数据时出错?【英文标题】:Getting an error when trying to parse data from a json in Swift 2.0? 【发布时间】:2016-02-28 22:34:50 【问题描述】:

我在尝试从 json 解析数据时遇到问题。

这是我遇到的错误

无法将“__NSArrayI”(0x10e7eb8b0)类型的值转换为“NSDictionary”(0x10e7ebd60)

            let jsonResult: AnyObject?
        do 
            jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: [])
            print(jsonResult, terminator: "");
            let channel: NSDictionary! = jsonResult!.valueForKey("CATEGORY_NAME") as! NSDictionary;
            print(channel, terminator: "");
            let result: NSNumber! = channel.valueForKey("EVENT_NAME") as! NSNumber;
            print(result, terminator: "");

            if (result == 0)
            
                let alertController = UIAlertController(title: "", message: "There is no live stream right now", preferredStyle: UIAlertControllerStyle.Alert)
                alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil))

                self.presentViewController(alertController, animated: true, completion: nil)
            

        
        catch
        
            // TODO: handle
        



task.resume()

我遇到错误的那一行是

让频道:NSDictionary! = jsonResult!.valueForKey("CATEGORY_NAME") 作为! NSDictionary;

【问题讨论】:

显然您的 JSON 包含一个数组,而不是 CATEGORY_NAME 键的字典。 【参考方案1】:

我同意上面的评论,即您试图强制使用错误的类型(这是应避免使用 ! 的原因),但在不知道数据结构的情况下很难为您提供工作代码。

JSON 通常以***数组或***字典的形式出现。您可以使用NSDictionaryNSArray,甚至可以使用普通的Swift 字典和数组。下面的代码将解析***字典或数组。您可以将 NSJSONSerialization 调用的结果传递给它。

func parse (jsonResult: AnyObject?) 

    // If our payload is a dictionary
    if let dictionary = jsonResult as? NSDictionary 
        // Tried to figure out the keys from your question
        if let channel = dictionary["CATEGORY_NAME"] as? NSDictionary 
            print("Channel is \(channel)")
            if let eventName = channel["EVENT_NAME"] as? NSNumber 
                print ("Event name is \(eventName)")
            
        

        // Same parsing with native Swift Dictionary, assuming the dictionary keys are Strings
        if let channel = dictionary["CATEGORY_NAME"] as? [String: AnyObject] 
            print("Channel is \(channel)")
            if let eventName = channel["EVENT_NAME"] as? NSNumber 
                print ("Event name is \(eventName)")
            
        

    // Or perhaps our payload is an array?
     else 
        if let array = jsonResult as? NSArray 
            for element in array 
                print(element)
            
        

        // Again, same parsing with native Swift Array
        if let array = jsonResult as? [AnyObject] 
            for element in array 
                print(element)
            
        
    


parse (["CATEGORY_NAME":["EVENT_NAME" : 22]])
parse (["FOO", "BAR", ["EVENT_NAME" : 22]])

【讨论】:

以上是关于尝试从 Swift 2.0 中的 json 解析数据时出错?的主要内容,如果未能解决你的问题,请参考以下文章

使用 swiftyJSON 在 Swift 2.0 中解析 JSON 时获取空值

在 swift 2.0 中解析 JSON 时出错

如何正确解析 SWIFT 中的 JSON 对象

从 Guidebox API 在 Swift 中解析 JSON 数据

JSON 解析 --> Swift | JSON 写入中的***类型无效

尝试从 swift 2 中的 JSON 文件中读取重载错误出现