URLから取得している大きなJSON Stringを解析しようとしています。私がテストに使用していますJSONは以下の通りです:SwiftでDecodableとCodingKeysを使用してJSONを解析する4
let json = """
{
"feed": {
"title": "Harry Potter",
"test": "I dont want this value",
"results": [
{
"author": "JK Rowling",
"artworkURL": "A url",
"genres": [
{
"name": "Fantasy"
},
{
"name": "Scifi"
}
],
"name": "Goblet of Fire",
"releaseDate": "2000-07-08"
},
{
"author": "JK Rowling",
"artworkURL": "A url",
"genres": [
{
"name": "Fantasy"
},
{
"name": "Scifi"
}
],
"name": "Half Blood Prince",
"releaseDate": "2009-07-15"
}
]
}
}
""".data(using: .utf8)!
私はにデータを配置するために、結合データの構造体を持っている:
struct Genre: Decodable {
let name: String
}
struct Book: Decodable {
let author: String
let artworkURL: URL
let genres: [Genre]
let name: String
let releaseDate: String
}
struct BookCollection {
let title: String
let books: [Book]
enum CodingKeys: String, CodingKey {
case feed
}
enum FeedKeys: String, CodingKey {
case title, results
}
enum ResultKeys: String, CodingKey {
case author, artworkURL, genres, name, releaseDate
}
enum GenreKeys: String, CodingKey {
case name
}
}
extension BookCollection: Decodable {
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
let feed = try values.nestedContainer(keyedBy: FeedKeys.self,
forKey: .feed)
self.title = try feed.decode(String.self, forKey: .title)
self.books = try feed.decode([Track].self, forKey: .results)
}
}
私はそのようにのような情報をオフに印刷しています:
do {
let response = try JSONDecoder().decode(BookCollection.self, from: json)
for book in response.books {
print(book.genres)
}
} catch {
print(error)
}
ジャンル以外の情報をすべて印刷しても問題ありません。これは私にのジャンルの配列を与えますが、私は book.genres.name
という名前にアクセスすることはできません。私は使用する必要があります: book.genres[0]
そしてそれは私にちょうど最初のインデックスの結果を与えます。
私のBookCollection
拡張でJSONのデコードを完璧にする方法がありますか?book.genres.name
を利用しますか?
はあなたが本当にその余分name
プロパティが必要な場合は、新しい拡張機能で行うことができますあなたの
'book.genres.name'のどの値が返されるべきですか? –
@PauloMattos各ブックの配列を返す必要があります。最初の本の場合、それは 'ファンタジー'と 'サイフィー'でしょう。 –
@DominicPillaあなたはブック構造体 '拡張子帳に読み取り専用の計算プロパティを追加することができます{ のvar allGenres:[文字列] { 戻りgenres.map {$ 0.name}} }'と '使うプリント(book.allGenres ) ' –