2017-06-06 37 views
1

我正在尝试引用xcode 8中的这个json(link here)中的所有“标题”。问题是在我可以提取标题数据之前需要引用一个对象和数组(我相信),并且我不知道该怎么做。如何在xcode 8中的对象内引用数组中的对象?

到目前为止,这是我已经有了:

func fetchFeed(){ 
    let urlRequest = URLRequest(url: URL(string: "http://itunes.apple.com/us/rss/topalbums/limit=10/json")!) 

    let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in 

     if error != nil { 
      print(error) 
      return 
     } 

     self.artists = [Artist]() 
     do { 
      let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! [String : AnyObject] 

      if let feedFromJson = json["feed"]?["entry"] as? [[String : AnyObject]] { 
       for feedFromJson in feedsFromJson { 
        let feed = Feed() 
        if let entry = feedFromJson["entry"] as? String, let author = feedFromJson["domain"] as? String { 

         feed.entry = entry 

         article.headline = title 

        } 
        self.articles?.append(article) 
       } 
      } 
      DispatchQueue.main.async { 
       self.tableview.reloadData() 

并感谢您的帮助提前!

回答

0

我正在努力尝试了解您需要什么。如果你想得到一个Article数组,其中headline是条目的标题标签,下面是我如何欺骗它。

func articles(from json: Any?) -> [Article] { 
    guard let json = json as? NSDictionary, let entries = json.value(forKeyPath: "feed.entry") as? [NSDictionary] else { 
     return [] 
    } 

    return entries.flatMap { entry in 
     guard let title = entry.value(forKeyPath: "title.label") as? String else { 
      return nil 
     } 

     var article = Article() 
     article.headline = title 
     return article 
    } 
} 

你怎么称呼它这样

self.articles = articles(from: json) 

NSDictionary有方法value(forKeyPath:)是附近神奇。调用json.value(forKeyPath: "feed.entry")返回一个字典数组。每个字典都是json中的一个"entry"对象。接下来,我映射每个条目以呼叫entry.value(forKeyPath: "title.label"),它返回一个字符串。


如果这东西比一个快速解决方案的更多,那么我会考虑增加SwiftyJSON到您的项目。

func articles(from json: Any?) -> [Article] { 
    return JSON(json)["feed"]["entry"].arrayValue.flatMap { entry in 
     guard let title = entry["title"]["label"].string else { 
      return nil 
     } 

     var article = Article() 
     article.headline = title 
     return article 
    } 
} 
+0

你是对的,价值(forKeyPath)是敬虔的。这解决了我的问题。谢谢!! – AceVentura

-1
  1. 有两种标题。 “饲料”和“入口”。

if let entry = feedFromJson [“entry”] as?字符串,让author = feedFromJson [“domain”]为?字符串{

iOS的做法不是这样。

feedFromJson [“entry”]为零,不是字符串。我猜你试图获得“饲料”的标题。

if let entry = (json["feed"] as Dictionary)?["title"] 

获取“输入”标题。只需遍历数组,并获得标题。

let titleDict = feedFromJson["title"] as? Dictionary 
let title = titleDict["title"] as? String 
article.headline = title 
  • 更好了解JSON数据的结构。
  • 这太快了。

    if let feedFromJson = json [“feed”]?[“entry”] as? [[String: AnyObject]] {

    你应该一步一步来。

    if let feedFromJson = (json["feed"] as Dictionary)?["entry"] as? [[String : AnyObject]] { 
    
    +0

    感谢提示Jeffery和DengApro,今晚将使用它们,并会让你知道它是如何发生的。 干杯 – AceVentura

    +0

    杰弗瑞的方法更快捷,.flatMap是一个很好的monad。矿井很直观,找出结构,获取数据,JSON并不难。我也更喜欢SwiftyJSON。 – dengApro

    相关问题