我有一个使用Codable
解析JSON的结构。
struct Student: Codable {
let name: String?
let amount: Double?
let adress: String?
}
现在,如果金额值为空,则JSON解析失败。
那么我应该手动处理Int
结构中存在的所有Double
和Student
的空案例吗?
将自动处理作为null的String
值。
答案 0 :(得分:8)
让我为你做这个游乐场,因为一个例子向你展示了超过一百个单词:
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
个案件,但它们仍然是痛苦的屁股。
答案 1 :(得分:1)
正在浏览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...
}
即使您将do-catch
块与try? decoder....
添加在一起,如果失败也会被捕获。希望那很清楚!即使模型包含5个或更多的属性,其中一些包含null
值,也很容易找到问题