2017-06-06 11 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

    相關問題