微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用和不使用数组解码不同的类型

如何解决使用和不使用数组解码不同的类型

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

如果错误出现在数组格式中,名称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
 }
}

解决方法

您必须手动实现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 {
  // ..
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。