2017-09-21 9 views
0

SwiftのリモートJSON解析は私にとって新しく、数週間かけてこれを理解しようとしました。SwiftのJSON深くネ​​ストされたオブジェクトへのアクセス

Iから引っ張ってるJSONはこの男である: http://www.odysseynewsmagazine.net/wp-json/wp/v2/posts?_embed

私は各記事の画像のためにその「SOURCE_URL」を取得しようとしているが、それは内にネストされた「media_details」 "内にネストされていますwp:featuredmedia "は" _embedded "内でネストされています。

私が書いたコードは次のようになります。

func parseData() { 
     fetchedSlug = [] 
     //from odyssey site 
     let url = "http://www.odysseynewsmagazine.net/wp-json/wp/v2/posts?_embed" 
     var request = URLRequest(url: URL(string: url)!) 
     request.httpMethod = "GET" 

     let configuration = URLSessionConfiguration.default 
     let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main) 

     let task = session.dataTask(with: request) { (data, response, error) in 
      if error != nil { 
       print("Error") 
      } 
      else { 
       do { 
        let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray 

        //Json objects to variables 
        for eachFetchedSlug in fetchedData { 
         let eachSlug = eachFetchedSlug as! [String: Any] 
         let slug = eachSlug["slug"] as! String 
         let link = eachSlug["link"] as! String 
         self.fetchedSlug.append(Slug(slug: slug, link: link)) 
        } 
        self.slugTableView.reloadData() 
       } 
       catch { 
        print("Error2") 
       } 
      } 
     } 
     task.resume() 
    } 
}//end of VC Class 

class Slug { 
    //define variables 
    let slug: String? 
    let link: String? 

    init(slug: String?, link: String?) { 
     self.slug = slug 
     self.link = link 
    } 

    //creating dictionaries from Json objects 
    init(slugDictionary: [String : Any]) { 
     self.slug = slugDictionary["slug"] as? String 
     link = slugDictionary["link"] as? String 
    } 
} 

は私も「タイトル」内「レンダリング」で発見された各記事のタイトルを必要とするつもりです。

この情報はすべて、tableView内の再利用可能なカスタムセル内にラベルを挿入しています。私はスラッグとリンクのラベルに値を入れることができますが、ネストされた情報は入れません。

「埋め込み」の前にあるアンダースコアは何ですか?それで私は何にもできないのですか?私はそれを遠ざけることができますか?プラグインをダウンロードしたり、カスタムスクリプトを実行することは許可されていません。

答えて

0

より良いREST APIをインストールするには

Screenshot

+0

プラグインを回避する方法はありますか?彼らはWordPressのサイトをまったく混乱させる前に、機能的にしたいと考えていたことについてかなり堅かったです。他に方法がないという証拠が必要です。 –

0

プラグイン画像をフィーチャーコードの下に確認してください。

for eachFetchedSlug in fetchedData { 
    let eachSlug = eachFetchedSlug as! [String: Any] 
    let slug = eachSlug["slug"] as! String 
    let link = eachSlug["link"] as! String 
    self.fetchedSlug.append(Slug(slug: slug, link: link)) 

    let title = eachSlug["title"] as! [String: Any] 
    let rendered = String(describing: title["rendered"]) 
    print(rendered) // this is title 

    let embedded = eachSlug["_embedded"] as! [String: Any] 
    let wpfeaturedmedias = embedded["wp:featuredmedia"] as! [Any] 
    for wpfeaturedmedia in wpfeaturedmedias { 
     let featuredmedia = wpfeaturedmedia as! [String: Any] 
     let mediaDetails = featuredmedia["media_details"] as! [String: Any] 
     let mediaDetailsSize = mediaDetails["sizes"] as! [String: Any] 
     let mediaDetailsSizeThumbnail = mediaDetailsSize["thumbnail"] as! [String: Any] // getting only thumbnail. Based on you requirement change this to 
     let image = String(describing: mediaDetailsSizeThumbnail["source_url"]) 
     print(image) // this is image 
    } 
} 

を私はthumbnailを取得するためのコードを追加しました。 sizesには多くのタイプ(medium,medium_large ...)があります。要件に基づいて、値を変更します。

オプションを確認する場合は、追加する方がよいでしょう。非常に多くのコンバージョンが存在するためです。変換に失敗すると、クラッシュします。

関連する問題