swift - 使用和不使用数组解码不同类型
问题描述
我正在尝试按如下方式解码错误,我正在处理的大多数错误都是数组格式[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
}
}
解决方案
您必须手动实现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 {
// ..
}
推荐阅读
- c# - 如何从文本文件中读取序列号
- django - AttributeError:“NoneType”对象在 openEdx exchange_token api 上没有属性“get”
- laravel - 将 laravel 部署到 Nginx 中出现错误“无法打开流:没有这样的文件或目录”
- reactjs - ScrollView 不跟踪当前位置。轻按时它会重置回之前的位置
- perl - 需要遍历目录 - 删除匹配模式的行
- html - 背景图像不会出现在 HTML 中
- python - 使用 Python 推导出连续时间戳之间的增量
- sql-server - 如何使用 IP 通过 Internet 连接到 SQL Server 以运行 Windows 应用程序?
- php - PHP 7.0+ 出现问题,$_SESSION[] 无法像以前一样工作
- node.js - 使用 dns.resolveMX() 在 node.js 上未定义的 MX 记录