Не могу декодировать Json в Swift. Ошибка!
Всем привет! При декодировании появляется ошибка "Expected to decode Double but found a string/data instead.", декодировал Json через онлайн сервис https://app.quicktype.io/. В чем проблема?
Вот код:
class ViewController: UIViewController {
@IBOutlet weak var searchBar: UISearchBar!
override func viewDidLoad() {
super.viewDidLoad()
makeRequest()
}
private func makeRequest() {
let url = URL(string: "https://itunes.apple.com/search?term=jack+johnson&limit=25")!
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data else { return }
guard error == nil else { return }
do {
let track = try JSONDecoder().decode(Track.self, from: data)
print(track)
} catch let error {
print("ERROR - \(error)")
}
}.resume()
}
}
Структура для декодирования:
// MARK: - Track
struct Track: Codable {
let resultCount: Int?
let results: [Result]?
}
// MARK: - Result
struct Result: Codable {
let wrapperType: WrapperType?
let kind: Kind?
let artistID, collectionID, trackID: Int?
let artistName, collectionName, trackName, collectionCensoredName: String?
let trackCensoredName: String?
let artistViewURL, collectionViewURL, trackViewURL: String?
let previewURL: String?
let artworkUrl30, artworkUrl60, artworkUrl100: String?
let collectionPrice, trackPrice: Double?
let releaseDate: Date?
let collectionExplicitness, trackExplicitness: Explicitness?
let discCount, discNumber, trackCount, trackNumber: Int?
let trackTimeMillis: Int?
let country: Country?
let currency: Currency?
let primaryGenreName: String?
let isStreamable: Bool?
let collectionArtistID: Int?
let collectionArtistViewURL: String?
var trackRentalPrice, collectionHDPrice, trackHDPrice, trackHDRentalPrice: Double?
let contentAdvisoryRating, shortDescription, longDescription: String?
let hasITunesExtras: Bool?
let collectionArtistName: CollectionArtistName?
}
enum CollectionArtistName: String, Codable {
case jackJohnson = "Jack Johnson"
}
enum Explicitness: String, Codable {
case notExplicit = "notExplicit"
}
enum Country: String, Codable {
case usa = "USA"
}
enum Currency: String, Codable {
case usd = "USD"
}
enum Kind: String, Codable {
case featureMovie = "feature-movie"
case song = "song"
}
enum WrapperType: String, Codable {
case track = "track"
}
Полный текст ошибки:
typeMismatch(Swift.Double, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "results", intValue: nil),
_JSONKey(stringValue: "Index 0", intValue: 0), CodingKeys(stringValue: "releaseDate", intValue: nil)], debugDescription: "Expected to decode Double but found a string/data instead.", underlyingError: nil))
Ответы (1 шт):
Автор решения: Oleg Soloviev
→ Ссылка
У вас
let releaseDate: Date?
при этом "releaseDate":"2005-01-01T12:00:00Z" в json. Декодер не может понять формат даты.
Попробуйте заменить на
let releaseDate: String?
Дату потом обработаете.