解析 JSON Swift 下标错误

标签: json ios Swift
发布时间: 2017/3/5 14:28:25
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我试图分析一些 JSON 在 swift 和我得到下标错误。我已经试图扮演而不是 NSDictinary AnyObject 不得要领。很困。任何帮助将不胜感激。这里是我的代码︰

override func viewDidLoad() {
    super.viewDidLoad()

    splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible

    UINavigationBar.appearance().barTintColor = UIColor(red: 52.0/255.0, green: 170.0/255.0, blue: 220.0/255.0, alpha: 1.0)
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]


    let url = NSURL(string:"https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y")!
    let session = NSURLSession.sharedSession()

    let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

        if error != nil {

            print(error)

        } else {

            if let data = data {

             //print(NSString(data: data, encoding: NSUTF8StringEncoding))

                do { let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary


                    if jsonResult!.count > 0 {


                        if let items = jsonResult["Date"] as? NSArray {


                            print(items)


                        }




                    }


                } catch {



                }

        }


    }


}


    task.resume()


}

解决方法 1:

好吧,别的咬我的头,但是是很可能在 jsonResult 中是有没有"日期"键?那是我是如何理解"下标"错误。

另外,当我从您正在使用的 URL 中提取数据,还有没有"日期"对象。

......后来......

唐,这里是我受命完成你问你最近的评论中为︰

// JSONTest
import UIKit

class ViewController: UIViewController {

    // MARK: Properties
    var events: [EventRecord] = []

    // MARK: Types
    struct EventRecord {

        struct Event {
            let href: NSURL?
            let text: String?
        }

        let event: Event
        let hasta: String?
        let location: String?
    }

    // MARK: View lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible

        UINavigationBar.appearance().barTintColor = UIColor(red: 52.0/255.0, green: 170.0/255.0, blue: 220.0/255.0, alpha: 1.0)
        UINavigationBar.appearance().tintColor = UIColor.whiteColor()
        UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName : UIColor.whiteColor()]

        let url = NSURL(string:"https://www.kimonolabs.com/api/7flcy3qm?apikey=gNq3hB1j0NtBdAvXJLEFx8JaqtDG8y6Y")!
        let session = NSURLSession.sharedSession()

        let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in

            if error != nil {

                print(error)

            } else {

                if let data = data {

                    //print(NSString(data: data, encoding: NSUTF8StringEncoding))

                    do {

                        let jsonResult = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers) as? NSDictionary

                        if jsonResult!.count > 0 {

                            if let results = jsonResult!["results"] as? NSDictionary, collection2 = results["collection2"] as? NSArray {

                                for entry in collection2 {
                                    if let dict = entry as? NSDictionary {
                                        self.events.append(self.processEntryDict(dict))
                                    }
                                    else {
                                        // BARF!
                                    }
                                }

                                print("events:\(self.events)")
                            }
                        }
                    } catch {
                        print("In catch block")
                    }
                }
            }
        }

        task.resume()
    }

    // MARK: Helper methods

    /// processEntryDict creates an `EventRecord` from the individual entry passed to the method and returns it to the caller.
    func processEntryDict(entry:  NSDictionary) -> EventRecord {

        // Each object in the "collection2" array is a dictionary of the form:
        //    {
        //        "Event": {
        //            "href": "http://www.vigolowcost.com/event/ceos-e-mares-de-felipe-aranda/?instance_id=31511",
        //            "text": "“Ceos e Mares” de Felipe Aranda"
        //        },
        //        "Hasta": "oct 23 todo el día",
        //        "Location": "Detrás do Marco, Vigo",
        //        "index": 2,
        //        "url": "http://www.vigolowcost.com/agenda/"
        //    },
        //

        let hasta = entry["Hasta"] as? String
        let location = entry["Location"] as? String

        var eventHref: NSURL?
        var eventText: String?

        if let eventDict = entry["Event"] as? NSDictionary {
            if let hrefText = eventDict["href"] as? String {
                eventHref = NSURL(string: hrefText)
            }

            eventText = eventDict["text"] as? String
        }

        let eventRecordEvent = EventRecord.Event(href: eventHref, text: eventText)
        return EventRecord(event: eventRecordEvent, hasta: hasta, location: location)
    }

}

注意,添加了一个东西,确保"结果"和"collection2"存在,,然后提供一种手段来遍历条目在"collection2"。

我现在写类接近的方式,我想如果我在做我觉得你要去做。不过,我也会拉的 completionHandler session.dataTaskWithURL 出到其自己的方法调用。

这里有几点要注意︰

  • 我使用 // MARK: xxx 来隔离功能。这些评论导致 Xcode 的类标识符下拉箭头中的命名分隔线。(见下文)named dividers screen shot
  • 我创建了 EventRecord 结构来保存有关每个事件的信息。这会让它更容易交互在阵列中的事件,因为它是现在 Swift ArrayEventRecord 对象。(属性命名, events .)这也允许您自动利用所有严格的类型检查 Swift 提供。
  • 我处理的每个条目 collection2 使用新 processEntryDict(:) 函数。这是另一种方法,我试图保持代码模块化的与短的方法。这简化了测试、 维护、 文档和故障排除。
  • 声明 》 之前行 processEntryDict 是特殊的标记 (注意三个斜杠)。如果您选择单击上 processEntryDict ,您会注意到我在这里放的描述。这种东西是超级强大的目的 C.我不能确定是否是一样有用的 Swift
  • 现在,当您运行该程序,它喷出的事件到调试控制台的数组。很明显,你会想要做一些其他的因素与事件列表中,但这应该给您好领先前进您的项目。

让我知道如果你需要更多帮助,或如果你想要我给你解释任何的它。

我在这里,离开形象的"collection2"的内容的第一位因为它作为一个好的参考。

screen shot of 'capture2' array

官方微信
官方QQ群
31647020