Swift Codable null处理

时间:2018-04-18 07:56:21

标签: ios json swift codable decodable

我有一个使用Codable解析JSON的结构。

struct Student: Codable {
    let name: String?
    let amount: Double?
    let adress: String?
}

现在,如果金额值为空,则JSON解析失败。

那么我应该手动处理Int结构中存在的所有DoubleStudent的空案例吗?

将自动处理作为null的String值。

2 个答案:

答案 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值,也很容易找到问题