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 {
  // ..
}