Swift - 在JSON文件中读取

时间:2016-05-02 01:15:57

标签: ios json swift

使用Xcode 6.4并在swift中编程。

我正在键入一个应该从URL读取JSON的程序。可以在此URL(https://itunes.apple.com/us/rss/topmovies/limit=2/json)找到JSON的示例,并且我一直在使用此站点来解析JSON以便更好地阅读它(http://json.parser.online.fr/)。

现在我需要通过JSON的级别来实现 实际的电影名称和图片网址,但我输入了什么样的变量entryDictionary。我认为它应该是一个字典数组,并且这个编译,但是控制台中entryDictionary的输出看起来很草率,从Optionl开始(而不是条目{应该。)当我循环通过entryDictionary时,我得到表示条目没有AnyObject类型的下标的错误。

所以我问我如何从JSON中检索im:name字段和im:image。

func downloadDataFromURLString(urlString: String) {

   //Downloaded data and is now stored in data. Took code out because 
   //irrelevant to my problem at this point. Data variable has correct
   //JSON, now I am trying to parse it.

            } else { //download suceeded, time to parse
                var error: NSError? = nil
                var names = [String]()

                if let rootDictionary = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &error) as? [String: AnyObject] {

                    let feedDictionary = rootDictionary["feed"] as! [String: AnyObject]

                    let entryDictionary: AnyObject? = feedDictionary["entry"]

                    println(entryDictionary) //For debugging

                    //for entry in entryDictionary as! NSArray {
                      //  let name = entryDictionary["name"]
                       // let image = entryDictionary["image"]
                       // let movie = Movie(name: name!, image: image!)
                       // weakSelf!.movies.append(movie)
                    //}

这是JSON的蓝图

"feed":{
    "author":{},
    "entry":[
    {
        "im:name":{
          "label":"Deadpool"
         },
        "im:image":[],
        "summary":{},
        "im:price":{},
        "im:contentType":{},
        "rights":{},
        "title":{},
        "link":[],
        "id":{},
        "im:artist":{},
        "category":{},
        "im:releaseDate":{}

1 个答案:

答案 0 :(得分:1)

AnyObject确实不是可订阅的(您尝试下标一个类型为AnyObject的变量?["feed"])。您还应该尽可能避免使用NSArray和NSDictionary等Cocoa容器类型。这是一个如何从条目数组的名称数组中获取标签的示例:

import Foundation

func labels(feedDictionary:[String:AnyObject]) -> [String] {
    guard let entries = feedDictionary["entry"] as? [String:AnyObject] else {
        return []
    }

    return entries.flatMap { (key:String, value:AnyObject) -> String? in
        guard key == "im:name" else {
            return nil
        }

        guard let name = value as? [String:String] else {
            return nil
        }

        return name["label"]
    }
}
然而,我建议不要在Swift中使用NSJSONSerialization,除了最简单的情况,因为你最终会投射和包装选项,直到奶牛回家。

有很好的第三方库,例如FreddySwiftyJSON,它们可以应用Swift语言功能来完成非常方便的JSON(反)序列化体验。

例如,对于Freddy,您可以用以下样式表达您的问题:

let json = try JSON(data: data)
json.decode("feed", type:Feed.self)

struct Feed: JSONDecodable {
    let entries:[Entry]
    init(json: JSON) throws {
        self.entries = try json.arrayOf("entry", type:Entry.self)
    }
}

struct Entry:JSONDecodable {
    let name:IMName
    init(json: JSON) throws {
        self.name = try json.decode("im:name", type:IMName.self)
    }
}

struct IMName:JSONDecodable {
    let label:String
    init(json: JSON) throws {
        self.label = try json.string("label")
    }
}