Mendekode tipe yang berbeda dengan dan tanpa array

Oct 12 2020

Saya mencoba memecahkan kode kesalahan sebagai berikut, sebagian besar kesalahan yang saya tangani dalam format array [String], tetapi dalam beberapa kasus kesalahan tersebut tidak dalam format array, hanya a String.

Jika kesalahan datang dalam format array nama datang sebagai errors, tetapi jika itu adalah format string maka itu datang sebagai error. Bagaimana saya bisa menangani skenario ini?

Bagaimana saya bisa menangani skenario ini?

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

Jawaban

4 NewDev Oct 12 2020 at 00:35

Anda harus menerapkan init(from:)dan mencoba mendekode satu jenis secara manual , jika gagal, mendekode yang lain:

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

Bagian decoding normal:

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