Не могу декодировать 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?

Дату потом обработаете.

→ Ссылка