Как получить только определенные значения из сложного JSON (API Google Книг) в Swfit

Я пытался разработать приложение, которое извлекает определенную информацию о книге из API Google Книг (имя, автор и изображение) и отображает изображение в представлении коллекции.

var bookInfo = [Book]()

let urlString = "https://www.googleapis.com/books/v1/volumes/J8ahqXjUhAAC"

    

override func awakeFromNib() {
    super.awakeFromNib()
    collectionView.delegate = self
    collectionView.dataSource = self
    
    let url = URL(string: urlString)
    
    URLSession.shared.dataTask(with: url!) { (data, response, error) in
        do {
            self.bookInfo = try JSONDecoder().decode([Book].self, from: data!)
            for info in self.bookInfo {
                print(info.bookName)
            }
        }
        catch {
            print("error")
        }
    }
    
}

Ниже приведена структура, представляющая содержимое, которое я пытаюсь захватить, но не уверен, что это полностью правильно.

struct Book: Codable {
    var bookName: String
    var imageURL: String
    var pageCount: Int
    var author: String
    var format: String
}


struct volumeInfo: Codable {
    var bookInfo: [Book]
}

При запуске этого кода я не получаю никаких ошибок, но приложение не может ничего получить, и мои UIImageView пусто.

1 ответ

Решение

В BookСтруктура, которую вы используете, не будет работать, потому что она не соответствует ответу JSON. Это вся структура, но вы можете удалить ключи (свойства), которые не требуются, и она все равно будет работать:

struct Book: Codable {
    let kind, id, etag, selfLink: String
    let volumeInfo: VolumeInfo
    let saleInfo: SaleInfo
    let accessInfo: AccessInfo
}

struct AccessInfo: Codable {
    let country, viewability: String
    let embeddable, publicDomain: Bool
    let textToSpeechPermission: String
    let epub, pdf: Epub
    let webReaderLink, accessViewStatus: String
    let quoteSharingAllowed: Bool
}

struct Epub: Codable {
    let isAvailable: Bool
}

struct SaleInfo: Codable {
    let country, saleability: String
    let isEbook: Bool
}

struct VolumeInfo: Codable {
    let title: String
    let authors: [String]
    let publisher, publishedDate, description: String
    let industryIdentifiers: [IndustryIdentifier]
    let readingModes: ReadingModes
    let pageCount, printedPageCount: Int
    let dimensions: Dimensions
    let printType: String
    let categories: [String]
    let averageRating: Double
    let ratingsCount: Int
    let maturityRating: String
    let allowAnonLogging: Bool
    let contentVersion: String
    let panelizationSummary: PanelizationSummary
    let imageLinks: ImageLinks
    let language, previewLink, infoLink, canonicalVolumeLink: String
}

struct Dimensions: Codable {
    let height, width, thickness: String
}

struct ImageLinks: Codable {
    let smallThumbnail, thumbnail: String
}

struct IndustryIdentifier: Codable {
    let type, identifier: String
}

struct PanelizationSummary: Codable {
    let containsEpubBubbles, containsImageBubbles: Bool
}

struct ReadingModes: Codable {
    let text, image: Bool
}
Другие вопросы по тегам