如何在SWIFT中处理JSON中的空值

时间:2019-05-30 13:09:46

标签: json swift

我对JSON解码有问题。我具有 UpdateNickname UpdateNicknameMessage 结构,并且 UpdateNickname 中的变量 Message 可能为空。每当它为null时,我都会收到一个错误。我想解决这个问题。这是我的结构:

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的代码。我使用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。

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

消息为空时,我尝试解码JSON时出现错误

  

由于缺少数据,因此无法读取。

如何解决此问题并处理空值?

3 个答案:

答案 0 :(得分:2)

更改此行:

var Message: UpdateNicknameMessage

对此:

var Message: UpdateNicknameMessage?

现在一切正常。

答案 1 :(得分:1)

您可以将其作为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响应中创建模型类。

更新

我认为您首先需要更清楚使用可编码协议。考虑一下,由于任何XYZ原因,您的服务器给出了Internal server error。我认为您的方法无效。

我确定它将给出相同的错误。

  

由于缺少数据,因此无法读取。

所以我的第一个问题是

您如何在这种情况下进行管理?

从我这头来就是这样!

祝你生日快乐!

答案 2 :(得分:0)

将Structs中的所有变量设置为可选变量。

EX:

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