[英]Swift Codable null handling
我有一个使用Codable
解析 JSON 的结构。
struct Student: Codable {
let name: String?
let amount: Double?
let adress: String?
}
现在,如果金额值为 null,则 JSON 解析失败。
那么我应该手动处理Student
结构中存在的所有Int
和Double
的空情况吗?
自动处理以 null 形式出现的String
值。
让我为你做这个 Playground 因为一个例子向你展示了一百多个单词:
import Cocoa
struct Student: Codable {
let name: String?
let amount: Double?
let adress: String?
}
let okData = """
{
"name": "here",
"amount": 100.0,
"adress": "woodpecker avenue 1"
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let okStudent = try decoder.decode(Student.self, from:okData)
print(okStudent)
let nullData = """
{
"name": "there",
"amount": null,
"adress": "grassland 2"
}
""".data(using: .utf8)!
let nullStudent = try decoder.decode(Student.self, from:nullData)
print(nullStudent)
如果您使用可选项定义结构,则null
处理得很好。 但是,如果您可以避免它,我会建议您不要这样做。 Swift 提供了我所知道的最好的支持,帮助我不要忘记在可能发生的任何地方处理nil
情况,但它们仍然是个麻烦事。
正在浏览 Codable 并遇到了这个问题。
所以在这里要非常清楚,如果 JSON/响应将包含null
作为值,则将其解释为nil
。 因此,出于这个原因,可能包含null
的模型属性之一应标记为可选。
例如,考虑下面的 JSON 响应,
{
"name": "Steve",
"amount": null,
"address": "India"
}
模型应该如下, cos amount
返回null
。
struct Student: Codable {
let name: String
let amount: Double?
let address: String
}
Suggestion
:如果您要编写init(from decoder: Decoder) throws
,请始终使用如下所示的内容作为可选属性。
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
amount = try values.decodeIfPresent(String.self, forKey: .amount)
//so on...
}
即使你用try? decoder....
添加do-catch
块try? decoder....
try? decoder....
如果失败,它可以被捕获。 希望这很清楚!! 即使模型包含 5 个或更多属性,其中一些属性包含null
值,它也很简单但很难找到问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.