JSONDecoder не генерирует, когда JSON не соответствует структуре данных

Метод JSONDecoder.decode не вызывает ошибку, если входящий JSON не соответствует типу данных.

У меня есть такая модель данных, которая сопоставляет JSON с профилем пользователя:

struct DrivetimeUserProfile: Codable {

    var driverId: String?
    var name: String?
    var email: String?
    var phoneNumber: String?
    var city: String?
    var state: String?
    var experience: Int?

    private enum CodingKeys: String, CodingKey {

        case driverId = "driver_id"
        case name = "name"
        case email = "email"
        case phoneNumber = "phone"
        case city = "city"
        case state = "state"
        case experience = "experience"

    }
}

Если имя пользователя или пароль неверны, сервер вернет JSON, подобный этому \"Failure\":\"Enter correct username and password.\". Что не соответствует модели данных профиля пользователя, а декодирование JSONDecoder (). Не вызывает ошибки.

Вот полная реализация:

func loginUser(from url: URL, with username: String, and password: String, completionHandler: @escaping (DrivetimeUserProfile?, DrivetimeAPIError.LoginError?) -> Void) {

        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.cachePolicy = cachePolicy
        request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
        let query = "email=\(username)&password=\(password)"
        request.httpBody = query.data(using: .utf8)

        let task = session.dataTask(with: request) { (data, response, error) in

            guard let data = data else {
                completionHandler(nil, .EmptyData)
                return
            }

            do {
                let userProfile = try JSONDecoder().decode(DrivetimeUserProfile.self, from: data)
                self.userProfile = userProfile

                completionHandler(userProfile, nil)

            } catch (let error) {

                completionHandler(nil, .CannotDecodeJson)
            }
        }
        task.resume()
    }

Мне нужен этот обработчик завершения, чтобы зафиксировать возникшую ошибку, чтобы я мог предупредить пользователя в моем контроллере представления о том, что это за ошибка. Пожалуйста посоветуй

Спасибо


person Brendon Cheung    schedule 09.02.2019    source источник


Ответы (1)


Это огромный недостаток, если вы бездумно объявляете все члены структуры необязательными.

Если ключ не существует в структуре, все члены устанавливаются в nil, и ошибка не возникает.

person vadian    schedule 09.02.2019
comment
Какое было бы лекарство? - person Brendon Cheung; 09.02.2019
comment
Удалите вопросительные знаки, тогда вы получите сообщение об ошибке. Или добавьте необязательного Failure члена - person vadian; 09.02.2019