Mám užitočné zaťaženie, ako je uvedené nižšie
{
"name": "Dog",
"type": 1
}
a trieda, ktorú chcem previesť z json na vlastný typ, je uvedená nižšie
class Animal: Codable {
var name: String?
var type: String?
}
Proces dekódovania:
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!")
Objekt zvieraťa je nulový. Avšak podľa rozhovoru Apple WWDC (https://developer.apple.com/videos/play/wwdc2017/212/) mala priradiť hodnotu nil k vlastnosti typu. Pretože existuje nesúlad v „typových“ údajoch. (Očakávaný reťazec, ale Int bol nájdený)
Dokážete uhádnuť, aký je dôvod toho? Ak sa niektorý z typov údajov značky nezhoduje, potom sa celý objekt stáva nulovým, neznie mi to dobre.
odpovede:
1 pre odpoveď č. 1Prečítajte si prosím chybovú správu pozorne, dôvod je veľmi jasný (nie je potrebné) hádať)
Očakávaný reťazec, ale Int bol nájdený
znamená (nájdená) hodnota je Int
ale vyhlásil si a String
vlastnosť
všetko reťazce v JSON sú zabalené do úvodzoviek, typ pre type
je Int
class Animal: Codable {
var name: String?
var type: Int?
}
Ak súbor JSON obsahuje vždy obe hodnoty, deklarujte vlastnosti ako nepovinné odstránením otáznikov.
Implicitný dekodér / inicializátor zlyhá, ak akýkoľvek dôjde k chybe, môžete to vidieť len zo syntaxe kódu. Ak chcete mať jemnejšiu kontrolu, napíšte svoj vlastný vlastný inicializátor.