Decodifica di tipi diversi con e senza array
Oct 12 2020
Sto cercando di decodificare l'errore come segue, la maggior parte dell'errore che sto gestendo in formato array [String], ma in alcuni casi l'errore non è in formato array, solo un file String.
Se l'errore arriva nel formato array, il nome viene come errors, ma se è in formato stringa, allora viene come error. Come potrei gestire questo scenario?
Come potrei gestire questo scenario?
struct CustomError: Codable {
let errors: [String]
}
private func errorDecoding(data : Data) {
let decoder = JSONDecoder()
do {
let errorData = try decoder.decode(CustomError.self, from: data)
} catch {
// TODO
}
}
Risposte
4 NewDev Oct 12 2020 at 00:35
Dovresti implementare manualmente init(from:)e provare a decodificare un tipo, in caso contrario decodificarne un altro:
struct CustomError {
let errors: [String]
}
extension CustomError: Decodable {
enum CodingKeys: CodingKey { case errors, error }
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
do {
self.errors = try container.decode([String].self, forKey: .errors)
} catch DecodingError.typeMismatch,
DecodingError.keyNotFound {
let error = try container.decode(String.self, forKey: .error)
self.errors = [error]
}
}
}
La parte di decodifica è normale:
do {
let error = try JSONDecoder().decode(CustomError.self, from: data)
} catch {
// ..
}