Как обработать нулевое значение в JSON в SWIFT - PullRequest
0 голосов
/ 30 мая 2019

У меня проблема с декодированием JSON. У меня есть UpdateNickname и UpdateNicknameMessage структуры и переменная Сообщение внутри UpdateNickname может быть нулевым. Я получаю сообщение об ошибке, когда оно пустое. Я хочу справиться с этой проблемой. Вот моя структура:

struct UpdateNicknameMessage: Codable {
 let id: Int
 let nickname: String
 let email: String 
}

struct UpdateNickname: Codable {
 var Status: Int
 var Result: String
 var Message: UpdateNicknameMessage

enum CodingKeys: String, CodingKey {
    case Status = "Status"
    case Result = "Result"
    case Message = "Message"
}

init?(from jsonObject: AnyObject) {
    guard let Status1: Int = jsonObject.object(forKey: "Status") as? Int,
        let Result1: String = jsonObject.object(forKey: "Result") as? String,
        let Message1: UpdateNicknameMessage = jsonObject.object(forKey: "Message") as? UpdateNicknameMessage
        else { return nil }

    Status = Status1
    Result = Result1
    Message = Message1
  }
}

и JSON выглядит так:

{"Message": {
    email = "123@123.com";
    id = 56;
    nickname = testNickname;
}, 
 "Status": 200, 
 "Result": success}

И это мой код для декодирования JSON в swift. Я использую try catch для обработки моей ошибки.

            let decoder = JSONDecoder()
            do {
                let model = try decoder.decode(UpdateNickname.self, from: data)
                let serverStatus = model.Status

                if serverStatus == 200 {
                     //EVERYTHING IS FINE
                } else {
                     //server not working
                }
            } catch {
               //cant convert JSON into struct
               print(error.localizedDescription)
            }

поэтому моя переменная Сообщение может вернуть ноль, если с сервером что-то пойдет не так.

{"Message": null, 
 "Status": 400, 
 "Result": problem}

Когда я пытаюсь декодировать JSON, когда Сообщение равно нулю, я получаю ошибку

Данные не могут быть прочитаны, поскольку они отсутствуют.

Как я могу исправить эту проблему и обработать нулевое значение?

Ответы [ 3 ]

2 голосов
/ 30 мая 2019

Измените эту строку:

var Message: UpdateNicknameMessage

на эту:

var Message: UpdateNicknameMessage?

Теперь все будет хорошо.

1 голос
/ 30 мая 2019

Вы можете обработать это как optional.См. Ниже класс модели.

struct UpdateNicknameMessage : Codable {
    let email : String?
    let id : Int?
    let nickname : String?

    enum CodingKeys: String, CodingKey {
        case email = "email"
        case id = "id"
        case nickname = "nickname"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        email = try values.decodeIfPresent(String.self, forKey: .email)
        id = try values.decodeIfPresent(Int.self, forKey: .id)
        nickname = try values.decodeIfPresent(String.self, forKey: .nickname)
    }

}


struct UpdateNickname : Codable {
    let message : UpdateNicknameMessage?
    let status : Int?
    let result : String?

    enum CodingKeys: String, CodingKey {

        case message = "Message"
        case status = "Status"
        case result = "Result"
    }

    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        message = try values.decodeIfPresent(Message.self, forKey: .Message)
        status = try values.decodeIfPresent(Int.self, forKey: .Status)
        result = try values.decodeIfPresent(String.self, forKey: .Result)
    }

}

Я предлагаю использовать json4swift для создания класса модели из ответа JSON.

Обновление:

Я думаю, что вам нужно сначала разобраться в использовании кодируемого протокола.Учтите, ваш сервер выдает Internal server error по любой причине XYZ.Я думаю, что ваш подход не работает для этого.

Я уверен, что это даст ту же ошибку.

Данные не могут быть прочитаны, потому что они отсутствуют.

Итак, мой первый вопросЭто

Как вы могли бы справиться в такой ситуации?

Вот и все с моей стороны !!

Удачной кодировки !!

0 голосов
/ 30 мая 2019

Установите все ваши переменные в Structs как дополнительные.

EX:

var Status: Int?
 var Result: String?
 var Message: UpdateNicknameMessage? ```

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...