Ожидается, что декодировать Int, но вместо этого нашел номер - PullRequest
0 голосов
/ 27 октября 2018

У меня была проблема с анализом JSON в Swift 4.2.Вот следующий код, который показал ошибку во время выполнения.

Мои данные Json следующие, которые я получил от сервера.

{
    code: 406,
    message: "Email Address already Exist.",
    status: 0
}

Я использую Codable для создания своей структуры следующим образом

struct Registration: Codable {
    var code: Int
    var status: Int
    private enum CodinggKeys: String, CodingKey {
        case code
        case status
    }
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        do {
            self.code = Int(try container.decode(String.self, forKey: .code))!
        } catch DecodingError.typeMismatch {
            let value = try container.decode(Double.self, forKey: .code)
            self.code = Int(value);
        }

        do {
            self.status = try container.decode(Int.self, forKey: .status)
        } catch DecodingError.typeMismatch {
            let value = try container.decode(String.self, forKey: .status)
            self.status = Int(value);
        }
    }
} 

Но каждый раз, когда яошибка при разборе статус ключ.

Примечание. Я пытался проанализировать состояние в String, Int, Double, Decimal, NSInterger , но ни одна из них не работает.каждый раз, когда я получаю ту же ошибку.Ожидается декодировать UInt, но вместо этого найдено число.

Ответы [ 2 ]

0 голосов
/ 27 октября 2018

Сообщение об ошибке очень вводит в заблуждение.Это происходит, когда JSON содержит логическое значение, а структура имеет свойство Int для соответствующего ключа.

Скорее всего, ваш JSON на самом деле выглядит следующим образом:

{
    "code": 406,
    "message": "Email Address already Exist.",
    "status": false
}

и соответственно ваша структура должна быть

struct Registration: Codable {
    let code: Int
    let status: Bool
}

if let registration = try? JSONDecoder().decode(Registration.self, from: data) {
    print(registration.code) // 406
    print(registration.status) // false
}
0 голосов
/ 27 октября 2018

Вам не нужно реализовывать свой собственный инициализатор декодирования, если свойства вашей структуры уже Decodable. Также вам не нужно настраивать CodingKeys, как упомянуто @ Gereon.

Для следующих данных JSON:

let data = """
    {
        "code": 406,
        "message": "Email Address already Exist.",
        "status": 0
    }
    """.data(using: .utf8)!

Это отлично работает:

struct Registration: Codable {
    var code: Int
    var status: Int
}

if let registration = try? JSONDecoder().decode(Registration.self, from: data) {
    print(registration.code) // 406
    print(registration.status) // 0
}

См. Кодирование и декодирование пользовательских типов от Apple для получения дополнительной информации.

...