我正在使用以 JSON 格式返回数据的 restful web 服务。这是样本数据:
[
{
"name": "Mark E",
"categories": "process",
"id": 1,
"checkedOut": null,
"checkedOutBy": null
},
{
"name": "John",
"categories": null,
"id": 2,
"checkedOut": null,
"checkedOutBy": null
}
]
我正在使用此代码解析此 json。我也为此创建了结构模型。
let task = session.dataTask(with: url) { (data, response, error) in
var myModel = [MyModel]()
if let HTTPResponse = response as? HTTPURLResponse {
let status = HTTPResponse.statusCode
if(status == 200) {
guard let data = data else {
print("No Data!!")
return completion(false, myModel)
}
guard let json = try! JSONSerialization.jsonObject(with: data, options: []) as? NSArray else {
print("Not an array")
return completion(false, myModel)
}
for jsondata in json {
guard let newdata = MyModel(json: jsondata) else {
continue
}
myModel.append(newdata)
}
completion(true,myModel)
}else {
completion(false,myModel)
}
}
}
task.resume()
这是我的数据模型结构
struct MyModel {
var name : String
var categories : String
var id : Int
var checkedOut : String
var checkedOutBy : String
init?(json:Any) {
guard let myModel = json as? NSDictionary else {
return nil
}
guard let name = myModel["name"] as? String,
let id = myModel["id"] as? Int else {
return nil
}
self.name = author
self.id = id
// This is how I am handling the null values.
if let categories = myModel["categories"] as? String {
self.categories = categories
} else {
self.categories = ""
}
if let lastCheckedOut = myModel["lastCheckedOut"] as? String {
self.lastCheckedOut = lastCheckedOut
} else {
self.lastCheckedOut = ""
}
if let lastCheckedOutBy = myModel["lastCheckedOutBy"] as? String {
self.lastCheckedOutBy = lastCheckedOutBy
}else {
self.lastCheckedOutBy = ""
}
}
}
在 struct MyModel 中,我使用 if let 来检查空值。谁能建议我这是检查每个变量是否为空的正确方法?有没有其他方法可以做到这一点?
如果我使用 guard 检查空值,它不会将任何对象添加到数组中。
如果值为 null,那么它只需将空字符 "" 分配给该变量,它将添加到 MyModel 对象数组中。
Best Answer-推荐答案 strong>
检查特定类型并在失败时分配其他内容的常用方法是 nil 合并运算符:
self.lastCheckedOut = myModel["lastCheckedOut"] as? String ?? ""
旁注:考虑 JSON null 被反序列化为 NSNull 而不是 nil
关于ios - Swift 3 - 使用具有空值的结构模型保存 json,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/40951659/
|