ios - Swift:如何解码作为字符串或数组字符串返回的api的结果?
问题描述
我正在使用 Apple 的 NSUrlConnection 和 Codable 库。
我正在使用 Web API 为我的应用程序注册新用户。API 返回状态和消息(在我映射到模型的 json 中)。
这是我的模型课:
Struct SignUpResult {
let message: String
let status: String
}
Struct SignUpParams {
let name: String
let email: String
let mobile_no: String
let password: String
}
如果用户正确提供了所有参数,则消息将作为字符串返回。像这样:
{
"status": "OK",
"message": "User signup successfully"
}
另一方面,如果用户输入的参数不正确,则消息将作为数组返回。像这样:
{
"status": "INVALID_PARAMS",
"message": [
"The name may only contain letters."
]
}
如果参数不正确,那么我得到错误
"expected to decode a string but found an array instead".
这是我得到错误的代码:
let result = JSONDecoder().decode(SignUpResult.self, from: data)
我该怎么办?
解决方案
我的建议是解码status
为enum
并有条件地解码message
为String
or [String]
。messages
被声明为数组。
enum SignUpStatus : String, Decodable {
case success = "OK", failure = "INVALID_PARAMS"
}
struct SignUpResult : Decodable {
let messages : [String]
let status: SignUpStatus
private enum CodingKeys : String, CodingKey { case status, message }
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
status = try container.decode(SignUpStatus.self, forKey: .status)
switch status {
case .success: messages = [try container.decode(String.self, forKey: .message)]
case .failure: messages = try container.decode([String].self, forKey: .message)
}
}
}
推荐阅读
- c++ - 错误:从 'void*' 到 'node_t*' 的无效转换
- python - Faust.web API 服务器挂起异常
- c++ - 抛出 int 以表明只有双重 catch 处理程序执行......为什么这个双重处理程序捕获一个 int?
- sql - 如何对不同值求和 OVER (PARTITION BY DISTINCT)
- django - 为什么 django honybot 中的 Ip 是 None
- android - ClickableText() 点击偏移:生成的字符不符合预期,这是为什么呢?
- javascript - 反应错误 - 组件正在更改要控制的不受控制的输入
- r - 如何使用 read_excel 和 barplot 绘制直方图?
- c# - 使用 Windows 窗体上传 Arduino Sketch
- python - 使用 i2c 传感器和 RPIZ-CAM-VF 相机时 PiZero 远程 I/O 错误