使用和不使用数组解码不同类型
Decoding different type with and without array
我正在尝试按如下方式解码错误,我处理的大部分错误都是数组格式 [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 {
// ..
}
我正在尝试按如下方式解码错误,我处理的大部分错误都是数组格式 [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 {
// ..
}