JSONDecoder не выдает, когда JSON не соответствует структуре данных - PullRequest
0 голосов
/ 09 февраля 2019

Метод 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 (). Decode не выдает ошибку

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

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()
    }

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

Спасибо

1 Ответ

0 голосов
/ 09 февраля 2019

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

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

...