Как получить только определенные значения из сложного 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
}