Просматривал 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
значений.
person
Vinayak GH
schedule
21.01.2019
init(from decoder:)
. В принятом ответе кажется, что значение Int равно Null. - person Larme   schedule 18.04.2018null
(без строки) по умолчанию обрабатывается какnil
, поэтому предполагается, что декодирование будет успешным, если свойство является необязательным. Кстати: вы можете опустить CodingKeys. - person vadian   schedule 18.04.2018CodingsKeys
. Назовите свойство как (правильно написанное)address
и удалите все перечисление. - person vadian   schedule 18.04.2018?
). Это часть магииCodable
. Однако, если значениеnull
представляет собой строку"null"
, вам нужно написать собственный инициализатор, а затем, пожалуйста, обвините владельца службы в отправке этого ужасного JSON. - person vadian   schedule 18.04.2018"amount": null
в мой JSON работает нормально. - person Rob Napier   schedule 18.04.2018