我有一个使用
Codable
解析 JSON 的结构。
struct Student: Codable {
let name: String?
let amount: Double?
let adress: String?
}
现在,如果金额值为 null,则 JSON 解析失败。
那么我是否应该手动处理
Int
结构中存在的所有 Double
和 Student
的空情况?
自动处理为 null 的
String
值。
让我为您做这个游乐场,因为一个示例向您展示了一百多个单词:
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"
}
模型应该如下,因为
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...
}
即使你用
do-catch
添加try? decoder....
块,如果失败也可以捕获。希望那是清楚的!即使模型包含 5 个或更多属性,其中一些包含 null
值,它很简单,但很难找到问题。