我对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时出现错误
由于缺少数据,因此无法读取。
如何解决此问题并处理空值?
答案 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? ```