Décodage de types différents avec et sans tableau

Oct 12 2020

J'essaie de décoder l'erreur comme suit, la plupart des erreurs que je gère au format tableau [String], mais dans de rares cas, l'erreur n'est pas au format tableau, juste un String.

Si l'erreur vient dans le nom de format de tableau errors, mais s'il s'agit d'un format de chaîne, il s'agit de error. Comment pourrais-je gérer ce scénario?

Comment pourrais-je gérer ce scénario?

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

Réponses

4 NewDev Oct 12 2020 at 00:35

Vous devrez implémenter manuellement init(from:)et essayer de décoder un type, à défaut, en décoder un autre:

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 partie décodage est normale:

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