由于其格式,无法正确解析JSON数据?

时间:2015-11-17 08:05:21

标签: json swift parsing

我正在尝试解析看起来的数据: enter image description here

看起来每个记录都是顺序的.. 0,1,2然后在每个记录中有很多键值对,例如名称或showID。

我想进入每条记录,只获得某些对,例如名称,showID和日期。

这是我的代码,我不确定在循环中的项目应该是什么模式

换句话说,如何将特定字段放入空字典数组?

    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
                    {

                    }
                }

2 个答案:

答案 0 :(得分:0)

这个想法是创建一个结构(或类),其中包含您需要的属性,使用词典中的值通过初始化程序创建。

让我们说你想制作" Show"包含节目名称和节目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
    }
}

然后迭代你的词典并将每个词典传递给struct初始化程序,如下所示:

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)
        }
    }

}

struct initializer是一个可选的,意思是如果字典不包含键" name"或" showID"它不会创建对象,而是返回nil;这就是为什么我们使用flatMap代替map进行迭代的原因(因为flatMap展开了Optionals)。

现在您有一组对象shows,您可以使用sortfilter等Swift方法轻松过滤或排序其内容。

shows数组中的每个对象都是Show个对象,并且包含词典数据的nameshowID属性。

flatMap做的是通过在初始数组上迭代(如循环)来创建Show个对象的数组。在这一行:

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

$0表示当前数组元素。这意味着对于items数组中的每个元素,我们接受它并使用它创建一个新的Show实例,并将生成的对象数组放在常量shows中。 / p>

还经常使用map,但这里我们的Show结构的init是一个可选的init,所以它返回一个Optional Show,flatMap知道如何解决这个问题(它会安全地展开可选项并忽略其中的那些)map没有。

答案 1 :(得分:0)

如果您想简化您的儿子解析,请尝试使用此开源https://github.com/SwiftyJSON/SwiftyJSON

使用此功能可以访问第0项

的名称字段
let userName = json[0]["name"].string