I am having issues gracefully handling this error debugDescription: "Expected String value but found null instead."
I understand that in my struct that conforms to Codable
, my stored property would need to be declared an optional string, as I read in this post
I tried that and still the error occurs. I read also in that post that I could also customize the decoder to replace nil with an empty string. I do not know how to achieve this honestly.
here is my code:
struct Discover: Codable {
var page: Int
var totalResults: Int
var totalPages: Int
var results: [DiscoverResults]
enum CodingKeys: String, CodingKey {
case page
case totalResults = "total_results"
case totalPages = "total_pages"
case results = "results"
}
}
struct DiscoverResults {
var title: String
var releaseDate: String
var posterPath: String?
var id: Int
var genreIds: [Int]
var poster: UIImage?
enum CodingKeys: String, CodingKey {
case title
case posterPath = "poster_path"
case releaseDate = "release_date"
case id
case genreIds = "genre_ids"
}
}
extension DiscoverResults: Decodable {
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
title = try values.decode(String.self, forKey: .title)
releaseDate = try values.decode(String.self, forKey: .releaseDate)
posterPath = try values.decode(String.self, forKey: .posterPath)
id = try values.decode(Int.self, forKey: .id)
genreIds = try values.decode([Int].self, forKey: .genreIds)
}
}
extension DiscoverResults: Encodable {
func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(title, forKey: .title)
try container.encode(posterPath, forKey: .posterPath)
try container.encode(releaseDate, forKey: .releaseDate)
try container.encode(id, forKey: .id)
try container.encode(genreIds, forKey: .genreIds)
}
}
The posterPath
in DiscoverResults
is null for some of the movies as I am using a movie api. If the JSON itself is needed I will edit the post.