使用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":{}
答案 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,除了最简单的情况,因为你最终会投射和包装选项,直到奶牛回家。
有很好的第三方库,例如Freddy和SwiftyJSON,它们可以应用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")
}
}