Decodificando tipos diferentes com e sem array

Oct 12 2020

Estou tentando decodificar o erro da seguinte maneira, a maioria dos erros que estou tratando no formato de matriz [String], mas em alguns casos o erro não está no formato de matriz, apenas um String.

Se houver erro no formato do array, o nome será como errors, mas se for no formato de string, ele será exibido error. Como eu poderia lidar com esse cenário?

Como eu poderia lidar com esse cenário?

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
 }
}

Respostas

4 NewDev Oct 12 2020 at 00:35

Você teria que implementar manualmente init(from:)e tentar decodificar um tipo, caso contrário, decodificar outro:

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]
    }
  }
}

A parte da decodificação é normal:

do {
   let error = try JSONDecoder().decode(CustomError.self, from: data)
} catch {
  // ..
}