Codable
を使用してJSONを解析する構造体があります。
struct Student: Codable {
let name: String?
let amount: Double?
let adress: String?
}
ここで、金額の値がnullになると、JSON解析が失敗します。
Int
構造体に存在するすべてのDouble
およびStudent
のnullケースを手動で処理する必要がありますか?
NullとなるString
値は自動的に処理されます。
例では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
のケースが発生する可能性があるところはどこでも処理するのを忘れますが、それでもまだ苦痛ですお尻。
Codableを参照していて、この問題が発生しました。
つまり、ここで非常に明確になります。JSON/応答に値としてnull
が含まれる場合、nil
として解釈されます。したがって、そのため、null
を含む可能性のあるモデルのプロパティの1つをオプションとしてマークする必要があります。
例として、以下のJSON応答を考えます。
_{
"name": "Steve",
"amount": null,
"address": "India"
}
_
モデルは次のようになります。cosamount
は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
値が含まれている場合でも、問題を見つけるのは非常に困難です。