web-dev-qa-db-ja.com

Swiftコーディング可能なnull処理

Codableを使用してJSONを解析する構造体があります。

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

ここで、金額の値がnullになると、JSON解析が失敗します。

Int構造体に存在するすべてのDoubleおよびStudentのnullケースを手動で処理する必要がありますか?

NullとなるString値は自動的に処理されます。

9
Ekra

例では100語を超える単語を示しているので、この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は、私が知っている最高のサポートを提供してくれますnotnilのケースが発生する可能性があるところはどこでも処理するのを忘れますが、それでもまだ苦痛ですお尻。

6
Patru

Codableを参照していて、この問題が発生しました。

つまり、ここで非常に明確になります。JSON/応答に値としてnullが含まれる場合、nilとして解釈されます。したがって、そのため、nullを含む可能性のあるモデルのプロパティの1つをオプションとしてマークする必要があります。

例として、以下のJSON応答を考えます。

_{
"name": "Steve",
"amount": null,
"address": "India"
}_

モデルは次のようになります。cosamountnullを返します。

_struct Student: Codable {
    let name: String
    let amount: Double?
    let address: String
}_

Suggestioninit(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値が含まれている場合でも、問題を見つけるのは非常に困難です。

0
Vinayak GH