Не в состоянии разобрать общий Codable - PullRequest
0 голосов
/ 30 августа 2018

Я работаю с универсальным кодируемым для передачи ответа сети. Ниже я создал функцию, которая декодирует данные и возвращает результат:

Вот фрагмент этой функции:

 guard let jsonDataUnwrapped = jsonData,
                  let result: ServerResponse<T> = try? JSONDecoder().decode(ServerResponse<T>.self, from: jsonDataUnwrapped) else {
                completionHandler(.error(APIError.init(type: .parsingError)))
                return
            }

Код в ServerResponse:

struct ServerResponse<T: Codable> : Codable {
    var response: T
    var errors: [ServerError]
}

struct ServerError : Codable {
    var code: Int
    var message: String
}

В кодируемом классе я делаю это:

init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        email = try values.decodeIfPresent(String.self, forKey: .email)
        firstName = try values.decodeIfPresent(String.self, forKey: .firstName)
        lastName = try values.decodeIfPresent(String.self, forKey: .lastName)
        phoneNumber = try values.decode(String.self, forKey: .phoneNumber)
        if let status = try values.decodeIfPresent(String.self, forKey: .accountStatus) {
            accountStatus = UserStatus(rawValue: status)!
        }
    }

Этот код работает правильно, когда я получаю данные в ответном ключе. Но есть случай, когда я также получу пустой ключ ответа и у меня будет несколько ошибок:

{
    "response": {},
    "errors": [
        {
            "code": "104",
            "message": "Authentication failed"
        }
    ]
}

Когда я получаю пустой ответ, мне нужен массив ошибок, но я не могу его получить.

1 Ответ

0 голосов
/ 30 августа 2018

Было бы очень полезно, если бы вы добавили также сообщение об ошибке, но, глядя на код, все очевидно

Ожидается декодирование Int, но вместо этого найдена строка / данные.

В JSON все в двойных кавычках равно String даже "104" или "false"

struct ServerError : Codable {
    let code: String
    let message: String
}

Это не связано с проблемой, но объявляйте члены структуры постоянными (let), поскольку вы не собираетесь их изменять.

...