Swift Codable null处理

Ekr*_*kra 7 json ios swift codable decodable

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

struct Student: Codable {
    let name: String?
    let amount: Double?
    let adress: String?
}
Run Code Online (Sandbox Code Playgroud)

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

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

String自动处理作为null 的值.

Vin*_* GH 15

正在浏览 Codable 并遇到了这个问题。

因此,在这里要非常清楚,如果 JSON/响应将包含null作为值,则将其解释为nil. 因此,出于这个原因,可能包含的模型属性之一null应标记为可选。

例如,考虑下面的 JSON 响应,

{
"name": "Steve",
"amount": null,
"address": "India"
}
Run Code Online (Sandbox Code Playgroud)

模型应该如下,cosamount正在返回null

struct Student: Codable {
    let name: String
    let amount: Double?
    let address: String
}
Run Code Online (Sandbox Code Playgroud)

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...
    }
Run Code Online (Sandbox Code Playgroud)

即使您添加do-catch块,try? decoder....如果失败也可以捕获。希望这很清楚!!即使模型包含 5 个或更多具有某些包含null值的属性,它也很简单但很难找到问题

  • @VinayakGH 了解 `decodeIfPresent` 是今天帮助我的原因。 (3认同)

Pat*_*tru 10

让我为你做这个游乐场,因为一个例子向你展示了超过一百个单词:

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)
Run Code Online (Sandbox Code Playgroud)

null如果使用选项定义结构,则处理得很好.但是,如果你能避免,我会反对它.斯威夫特提供了我所知道的最好的支持,帮助我不要忘记处理nil任何可能发生的案件,但他们仍然是痛苦的屁股.