Ich versuche herauszufinden, warum die Verwendung optionaler URLs meine JSON-Decodierung mit Swift 4 fehlschlagen lässt. Ich habe bereits das WWDC-Video "Whats new in Foundation" ausgegossen. Äpfel Spielplatz Beispiele und eine Menge von Orten im Internet, aber haben keine Lösung gefunden.Optionale URLs, die JSON-Decodierung in Swift 4 unmöglich machen.
Dies ist ein Test, den ich erstellt habe, um das Problem zu zeigen. Sagen, das ist meine Json Daten:
let json = """
{
"kind" : "",
"total" : 2,
"image_url" : "https://www.myawesomeimageURL.com/awesomeImage.jpg"
}
""".data(using: .utf8)!
Und das ist mein struct:
struct BusinessService: Decodable {
let kind: String?
let total: Int
let image_url : URL?
}
Und hier ist, wo ich es serialisiert:
let myBusiness = try? JSONDecoder().decode(BusinessService.self, from: json)
print(myBusiness)
Nun ist das Problem, wenn ich json erhalten Daten, wo image_url fehlt, schlägt die JSON-Decodierung fehl und gibt mir null.
Ich bin verwirrt, warum "Art" eine optionale Zeichenfolge sein kann und nicht die JSON-Decodierung fehlschlagen, wenn es keinen Wert hat, aber Image_URL kann keine optionale URL sein, ohne dass der JSON fehlschlagen.
Ich habe versucht, dies für zwei Tage jetzt ohne Glück herauszufinden. Hat jemand einen Einblick, warum das scheitern würde?
Ich habe ein weiteres Puzzleteil bemerkt, und das ist die image_url in der JSON muss eigentlich keine gültige Bild-URL sein. Ich kann eine beliebige Zeichenfolge eingeben und meine Struktur wird serialisiert, also denke ich vielleicht, dass ich falsch verstehe, wie das funktioniert. Ich dachte, dass die URL automatisch nur dann gefüllt würde, wenn sie in eine gültige URL konvertiert werden könnte und das nicht geschieht.
Jeder Einblick in dieses würde sehr geschätzt werden.
Vielen Dank für die Erklärung. Das hat mich das ganze Wochenende verrückt gemacht. Ich arbeite nicht viel mit JSON, also wusste ich nicht, dass null ein gültiger Wert war. Es ist eine Schande, dass die API, die ich verwende (Yelp) übergibt "" anstelle von null. Ich muss in die JSON-Container schauen (denke ich), um dieses Problem zu lösen. Danke für die Hilfe! – SN81
Gerne helfen!Die "leeren" Fälle sind immer ein bisschen schwierig, da es leicht ist, eine leere Zeichenfolge und eine fehlende Zeichenfolge zu verwechseln. Der 'Optional'-Typ in Swift macht dies etwas besser, da Sie' .none' erhalten, wenn die Zeichenfolge fehlt, und '.some (" ")', wenn die Zeichenfolge vorhanden, aber leer ist. Das Übergeben von "" für fehlende URLs ist in der Tat eine schlechte Wahl. – zoul