Ios Swift:如何解码作为字符串或数组字符串返回的api的结果?
我正在使用苹果的NSUrlConnection和Codable库 我正在使用web API为我的应用程序注册新用户。API返回一个状态和一条消息(在json中,我将其映射到一个模型) 这是我的模型课:Ios Swift:如何解码作为字符串或数组字符串返回的api的结果?,ios,swift,nsurlconnection,codable,Ios,Swift,Nsurlconnection,Codable,我正在使用苹果的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: Strin
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."
]
}
另一方面,如果用户输入的参数不正确,则消息将作为数组返回。像这样:
{
"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)
我该怎么办?我的建议是将
状态
解码为枚举
,并有条件地将消息
解码为字符串
或[String]
<代码>消息声明为数组
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)
}
}
}
我建议您在结构中为
消息使用数组
,以防出现各种消息?您需要使用自定义init cf。尝试使用任何类型而不是String@shivi_shubDecodable
不支持任何谢谢Larme。你和瓦迪亚人的答案正是我想找的汉克斯。这很有效。我本来会投票支持你的答案,但我的名声还不够好。