Swift Codable null 处理

问题描述 投票:0回答:2

我有一个使用

Codable
解析 JSON 的结构。

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

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

那么我是否应该手动处理

Int
结构中存在的所有
Double
Student
的空情况?

自动处理为 null 的

String
值。

ios json swift codable decodable
2个回答
28
投票

让我为您做这个游乐场,因为一个示例向您展示了一百多个单词:

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
的情况,无论它们发生在哪里,但它们仍然是一个令人头疼的问题。


25
投票

在浏览 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

,它很简单,但很难找到问题。
© www.soinside.com 2019 - 2024. All rights reserved.