Я використовую json корисне навантаження, як показано нижче
{
"name": "Dog",
"type": 1
}
а клас, який я хочу перетворити з json на власний тип, наведений нижче
class Animal: Codable {
var name: String?
var type: String?
}
Процес декодування:
let decoder = JSONDecoder()
var animal: Animal?
do {
animal = try decoder.decode(Animal.self, from: data)
} catch DecodingError.keyNotFound(let key, let context) {
} catch DecodingError.valueNotFound(let type, let context) {
} catch DecodingError.typeMismatch(let type, let context) {
print("mismatch")
}
catch {
print("some error (error.localizedDescription)")
}
print(animal?.name ?? "Decode did not happen!")
Об'єкт тварини - нуль. Однак, згідно з розмовою про WWDC щодо яблук (https://developer.apple.com/videos/play/wwdc2017/212/) він повинен присвоїти значення nil для властивості type. Оскільки існує невідповідність даних "типу". (Очікуваний рядок, але Int знайдено)
Чи можете ви здогадатися, в чому причина цього? Якщо будь-який тип даних тегу не відповідає, тоді весь об'єкт стає нульовим, це не звучить добре для мене.
Відповіді:
1 для відповіді № 1Будь ласка, уважно прочитайте повідомлення про помилку, причина дуже чітка (не потрібно здогадатися)
Очікуваний рядок, але Int знайдено
означає (знайдене) значення Int
але ви оголосили String
власність
Все рядки в JSON обертаються подвійними лапками типу type
є Int
class Animal: Codable {
var name: String?
var type: Int?
}
Якщо JSON завжди містить обидва значення, оголошують властивості як необов’язкові, видаляючи знаки запитання.
Неявний декодер / ініціалізатор виходить з ладу, якщо будь-який виникає помилка, це ви можете побачити просто з синтаксису коду. Якщо ви хочете мати більш точний контроль, напишіть свій власний ініціалізатор.