首页 > 解决方案 > 使用和不使用数组解码不同类型

问题描述

我正在尝试按如下方式解码错误,我正在处理的大多数错误都是数组格式[String],但在少数情况下,错误不是数组格式,只是一个String.

如果错误出现在数组格式中,则名称为 as errors,但如果是字符串格式,则为error。我该如何处理这种情况?

我怎么能处理这种情况?

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

标签: swiftcodable

解决方案


您必须手动实现init(from:)并尝试解码一种类型,如果失败,则解码另一种:

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

解码部分正常:

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


推荐阅读