首页 > 解决方案 > 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)

我该怎么办?

标签: iosswiftnsurlconnectioncodable

解决方案


我的建议是解码statusenum并有条件地解码messageStringor [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)
        }
    }
}

推荐阅读