[swift]不能正确解析 JSON 数据由于其格式?

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

我想看的数据解析︰enter image description here

它看起来像是连续的每个记录。0,1,2,然后在每个记录有很多的键/值对的名称或 showID 等。

我想要走进每个记录,只能得到某些成对,例如名称、 showID 和日期。

这里是我的代码,我不确定我的modal在回路中的项目应该是什么

换句话说,我怎么具体领域到我空字典数组?

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

        if let urlContent = data
        {
            do
            {
                var jsonResult:NSDictionary = try NSJSONSerialization.JSONObjectWithData(urlContent, options: NSJSONReadingOptions.MutableContainers) as! NSDictionary

                if let items = jsonResult["items"] as! NSArray?
                {
                    var emptyArrayOfDictionary = [[String : AnyObject]]()

                    for item in 0...jsonResult.count
                    {

                    }
                }

解决方法 1:

的想法是创建一个结构 (或类),包含你需要的属性创建的初始值设定项从你的字典中的值。

比方说你想要"秀"对象包含显示名称和显示 id。

您可以创建一个这样的结构︰

struct Show {
    let name:String
    let showID:Int
    init?(dictionary: [String:AnyObject]) {
        guard let name = dictionary["name"] as? String,
          let showID = dictionary["showID"] as? Int else {
            return nil
        }
        self.name = name
        self.showID = showID
    }
}

然后遍历你的字典,并通过每个一到结构的初始值设定项,就像这样︰

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

    if let urlContent = data {
        do {
            if let jsonResult = try NSJSONSerialization.JSONObjectWithData(urlContent, options: []) as? [String : AnyObject] {

                if let items = jsonResult["items"] as? [[String : AnyObject]] {

                    let shows = items.flatMap { Show(dictionary: $0) }

                }

            }
        } catch {
            print(error)
        }
    }

}

结构初始值设定项是可选之一,也就是说,如果字典不包含键"名称"或"showID"它不会创建对象并将返回零相反;这就是为什么我们使用 flatMap 来循环而不是 map (因为 flatMap 打开件)。

现在您有一个数组对象, shows ,您可以筛选或排序它的内容很容易与 Swift 方法,如 sortfilter ,等等。

每个对象在 shows 数组是 Show 对象并有 nameshowID 带有你的词典的数据的属性。

什么 flatMap 确实是创建数组Show 通过迭代 (如循环) 初始数组对象。在这条线︰

let shows = items.flatMap { Show(dictionary: $0) }

$0表示当前数组元素。它的意思是,对于每个元素在 items 数组中,我们把它和创建一个新的 Show 实例,并把结果数组的对象放在不断 shows

此外,还有 map 这是经常使用,但这里的 init 我们 Show 结构是可选的 init,因此它返回可选的显示,和 flatMap 知道如何处理这 (它将安全地打开可选和忽略零的人) 在哪里 map 不。

赞助商