2017-09-24 10 views
1

だから私は現在、下スウィフト4つのデコード可能なJSONアレイ

にリンクされているJSON APIを解析するプログラムにウォーキングしていますアニメのオプションのタイプはうまくいきますが、それは動作することを示していますが、名前とリリース日と言語にもアクセスしたいと思っていますが、私はこのようなJSON配列をどのように使用するのか分かりません4。以下。

import UIKit 

struct AnimeJsonStuff: Decodable { 
    let data: [AnimeDataArray] 
} 

struct AnimeDataArray: Decodable { 
    let type: String? 
} 

class OsuHomeController: UICollectionViewController, UICollectionViewDelegateFlowLayout { 
    func jsonDecoding() { 
     let jsonUrlString = "https://kitsu.io/api/edge/anime" 

     guard let url = URL(string: jsonUrlString) else {return} // 
     URLSession.shared.dataTask(with: url) { (data, response, err) in 

      guard let data = data else {return} 

      do { 
       let animeJsonStuff = try JSONDecoder().decode(AnimeJsonStuff.self, from: data) 
       print(animeJsonStuff.data) 

       let animeDataArray = try JSONDecoder().decode(AnimeDataArray.self, from: data) 
       print(animeDataArray.type as Any) 
      } catch let jsonErr { 
       print("Error serializing json", jsonErr) 
      } 
     }.resume() 
    } 
} 

これ以降、コードが増えていますが、カスタムのcollectionViewCellsを設定するだけです。

は、私はすべてのキーのために追加din't:

はまた、ここに以下をご確認くださいapi

+1

質問は何ですか?また、これが特定のJSON文字列を解析する場合は、文字列_をあなたの質問に貼り付けてください。コードの_pictures_を表示しないでください。何も良いことはありません。 – matt

答えて

2

へのリンクです。私はattributesにいくつか追加しました。

struct AnimeJsonStuff: Decodable { 
    let data: [AnimeDataArray] 
} 

struct AnimeLinks: Codable { 
    var selfStr : String? 

    private enum CodingKeys : String, CodingKey { 
     case selfStr  = "self" 
    } 
} 
struct AnimeAttributes: Codable { 
    var createdAt : String? 

    private enum CodingKeys : String, CodingKey { 
     case createdAt  = "createdAt" 
    } 
} 
struct AnimeRelationships: Codable { 
    var links : AnimeRelationshipsLinks? 

    private enum CodingKeys : String, CodingKey { 
     case links  = "links" 
    } 
} 

struct AnimeRelationshipsLinks: Codable { 
    var selfStr : String? 
    var related : String? 

    private enum CodingKeys : String, CodingKey { 
     case selfStr  = "self" 
     case related  = "related" 
    } 
} 

struct AnimeDataArray: Codable { 
    let id: String? 
    let type: String? 
    let links: AnimeLinks? 
    let attributes: AnimeAttributes? 
    let relationships: [String: AnimeRelationships]? 

    private enum CodingKeys: String, CodingKey { 
     case id = "id" 
     case type = "type" 
     case links = "links" 
     case attributes = "attributes" 
     case relationships = "relationships" 
    } 
} 

JSONの解析:タイトル

func jsonDecoding() { 
    let jsonUrlString = "https://kitsu.io/api/edge/anime" 

    guard let url = URL(string: jsonUrlString) else {return} // 
    URLSession.shared.dataTask(with: url) { (data, response, err) in 
     guard let data = data else {return} 
     do { 
      let animeJsonStuff = try JSONDecoder().decode(AnimeJsonStuff.self, from: data) 
      for anime in animeJsonStuff.data { 
       print(anime.id) 
       print(anime.type) 
       print(anime.links?.selfStr) 
       print(anime.attributes?.createdAt) 
       for (key, value) in anime.relationships! { 
        print(key) 
        print(value.links?.selfStr) 
        print(value.links?.related) 
       } 
      } 
     } catch let jsonErr { 
      print("Error serializing json", jsonErr) 
     } 
    }.resume() 
} 
+0

ありがとう、これは動作します! – Dengekiko

1

回答 "スウィフト4つのデコード可能なJSONアレイ"

let decoder = JSONDecoder() 
do { 
    let array = try decoder.decode([YouCodableStruct].self, from: response.data!) 
    debugPrint(array) 
} catch { 
    debugPrint("Error occurred") 
} 

http://andrewmarinov.com/parsing-json-swift-4/

関連する問題