Вот моя проблема, когда я получаю какой-то JSON, бывает, что некоторые значения не соответствуют требуемому типу. Я действительно не против, меня интересует только значение, когда его тип правильный.
Например, следующая структура:
struct Foo : Decodable {
var bar : Int?
}
Я бы хотел, чтобы он соответствовал этим JSON:
{ "bar" : 42 } => foo.bar == 42
{ "bar" : null } => foo.bar == nil
{ "bar" : "baz" } => foo.bar == nil
Действительно, я ищу необязательный Int
, поэтому всякий раз, когда это целое число, я хочу его, но когда это null
или что-то еще, я хочу nil
.
К сожалению, наш старый добрый JSONDecoder
в последнем случае выдает ошибку несоответствия типов.
Я знаю ручной способ сделать это:
struct Foo : Decodable {
var bar : Int?
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.bar = try? container.decode(Int.self, forKey: .bar)
}
enum CodingKeys : CodingKey {
case bar
}
}
Но у меня много структур и много полей для проверки.
Поэтому я хотел бы знать, есть ли общий способ сделать это примерно так:
decoder.typeMismatchStrategy = .nilInsteadOfError // <= Don't try it at home, I know it does not exist...
Или, может быть, переопределить JSONDecoder
, все равно что-то писать один раз, а не на каждую структуру.
Заранее спасибо.
var bar : Any?
Потому что он может быть любым, как вы его описываете. - person Roman Ryzhiy   schedule 17.09.2020Int
. Более того, очень не хочется уходить от сильного шрифта, ставя вездеAny
. - person Zaphod   schedule 17.09.2020