繁体   English   中英

Swift Codable 空处理

[英]Swift Codable null handling

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

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

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

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

自动处理以 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-catchtry? decoder.... try? decoder....如果失败,它可以被捕获。 希望这很清楚!! 即使模型包含 5 个或更多属性,其中一些属性包含null值,它也很简单但很难找到问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM