Как настроить класс модели для вложенного ответа JSON с Alamofire и Decodable в iOS - PullRequest
0 голосов
/ 11 апреля 2020

Я использую Alamofire и Decodable для запроса API Google Книг для выполнения поиска. Я создал модель Decodable, которую я добавлю ниже, и она работала до тех пор, пока не попытался получить любое другое поле ниже «title» в «volumeInfo» (я комментировал свойства одно за другим, чтобы проверить, где они не работают). Ошибка, которую я получаю после раскомментирования «авторов», «издателя» или чего-либо, кроме «title» внутри «volumeInfo»:

responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.decodingFailed(error: Swift.DecodingError.keyNotFound(CodingKeys(stringValue: "publisher", intValue: nil)

Пример ответа:

  {
   "kind": "books#volume",
   "id": "Ett09eLWE5oC",
   "etag": "WIwTdsmpnhs",
   "selfLink": "https://www.googleapis.com/books/v1/volumes/Ett09eLWE5oC",
   "volumeInfo": {
    "title": "The Picture of Dorian Gray",
    "authors": [
     "Oscar Wilde"
    ],
    "publisher": "Wordsworth Editions",
    "publishedDate": "1992",
    "description": "The handsome appearance of dissolute young Dorian Gray remains unchanged while the features in his portrait become distorted as his degeneration progresses",
    "industryIdentifiers": [
     {
      "type": "ISBN_10",
      "identifier": "1853260150"
     },
     {
      "type": "ISBN_13",
      "identifier": "9781853260155"
     }
    ],
    "readingModes": {
     "text": false,
     "image": true
    },
    "pageCount": 312,
    "printType": "BOOK",
    "categories": [
     "Fiction"
    ],
    "averageRating": 4.0,
    "ratingsCount": 6,
    "maturityRating": "NOT_MATURE",
    "allowAnonLogging": false,
    "contentVersion": "1.1.2.0.preview.1",
    "panelizationSummary": {
     "containsEpubBubbles": false,
     "containsImageBubbles": false
    },
    "imageLinks": {
     "smallThumbnail": "http://books.google.com/books/content?id=Ett09eLWE5oC&printsec=frontcover&img=1&zoom=5&edge=curl&source=gbs_api",
     "thumbnail": "http://books.google.com/books/content?id=Ett09eLWE5oC&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api"
    },
    "language": "en",
    "previewLink": "http://books.google.ro/books?id=Ett09eLWE5oC&pg=PA130&dq=9781853260155&hl=&cd=1&source=gbs_api",
    "infoLink": "http://books.google.ro/books?id=Ett09eLWE5oC&dq=9781853260155&hl=&source=gbs_api",
    "canonicalVolumeLink": "https://books.google.com/books/about/The_Picture_of_Dorian_Gray.html?hl=&id=Ett09eLWE5oC"
   }
  }

My модель:

struct Response: Decodable {

    struct VolumeInfo: Decodable {
        var title: String
        //var authors: [String]
        var publisher: String
        //var identifiers: [Identifier]
       //var image: ImageLink

        enum CodingKeys: String, CodingKey {
            case title
            //case authors
            case publisher
            //case identifiers = "industryIdentifiers"
            //case image = "imageLinks"
        }
    }

    struct Identifier: Decodable {
        var type: String
        var identifier: String

        enum CodingKeys: String, CodingKey {
            case type
            case identifier
        }
    }

    struct ImageLink: Decodable {
        var url: URL

        enum CodingKeys: String, CodingKey {
            case url = "thumbnail"
        }
    }

    var id: String
    var volumeInfo: VolumeInfo
}
...