Прежде всего используйте Decodable
.
Создайте Response
как enum с регистрами success
и failure
и связанными типами TokenData
и ErrorData
enum Response : Decodable {
case success(TokenData)
case failure(ErrorData)
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
do {
self = try .success(container.decode(TokenData.self))
} catch DecodingError.keyNotFound {
self = try .failure(container.decode(ErrorData.self))
}
}
}
struct TokenData : Decodable {
let token, userEmail : String
let userId : Int
}
struct ErrorData : Decodable {
let code, message : String
}
let jsonSuccessString = """
{
"token": "eyJ0eXAiOiJKV1QiLCJhbG...",
"user_email": "test@myhost.com",
"user_id": 1
}
"""
let jsonFailureString = """
{
"code": "[jwt_auth] incorrect_password",
"message": "<strong>ERROR</strong>: Incorrect password",
"data": {
"status": 403
}
}
"""
Расшифруйте JSON и включите результат, пример декодирует обе строки для демонстрации
let successdata = Data(jsonSuccessString.utf8)
let failuredata = Data(jsonFailureString.utf8)
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let result1 = try decoder.decode(Response.self, from: successdata)
switch result1 {
case .success(let tokenData) : print(tokenData) // TokenData(token: "eyJ0eXAiOiJKV1QiLCJhbG...", userEmail: "test@myhost.com", userId: 1)
case .failure(let errorData) : print(errorData)
}
let result2 = try decoder.decode(Response.self, from: failuredata)
switch result2 {
case .success(let tokenData) : print(tokenData)
case .failure(let errorData) : print(errorData) // ErrorData(code: "[jwt_auth] incorrect_password", message: "<strong>ERROR</strong>: Incorrect password")
}
} catch {
print(error)
}