Zde je kód, od mýho hřiště s json vzorku:
import Foundation
let json = """
{
"date": {
"type": "String",
"value": "03/04/1982",
"valueInfo": {}
},
"Scanner": {
"type": "Object",
"value": {
"contentType": "image/jpeg ",
"url": "https://www.pexels.com/photo/neon-advertisement-on-library-glass-wall-9832438/",
"fileName": "sample.jpeg"
},
"valueInfo": {
"objectTypeName": "com.google.gson.JsonObject",
"serializationDataFormat": "application/json"
}
},
"startedBy": {
"type": "String",
"value": "super",
"valueInfo": {}
},
"name": {
"type": "String",
"value": "kucoin",
"valueInfo": {}
},
"ScannerDetails": {
"type": "Json",
"value": {
"accountNumber": "ANRPM2537J",
"dob": "03/04/1982",
"fathersName": "VASUDEV MAHTO",
"name": "PRAMOD KUMAR MAHTO"
},
"valueInfo": {}
}
}
"""
let data = json.data(using: .utf8, allowLossyConversion: false)!
struct ObjectScanner: Decodable {
let contentType: String
let url: String
let fileName: String
}
enum ObjectScannerType {
case object(ObjectScanner)
}
struct Scanner: Decodable {
enum ScannerType: String, Decodable {
case object = "Object"
}
enum CodingKeys: String, CodingKey {
case type, value
}
let scanner: ObjectScannerType
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let type = try container.decode(ScannerType.self, forKey: .type)
switch type {
case .object:
let value = try container.decode(ObjectScanner.self, forKey: .value)
scanner = .object(value)
}
}
}
struct DateResponse: Decodable {
let type: String
let value: String
// let valueInfo // Not enough information in sample for me to decode this object
}
struct Response: Decodable {
enum CodingKeys: String, CodingKey {
case date
case scanner = "Scanner"
}
let date: DateResponse
let scanner: Scanner
}
let decoder = JSONDecoder()
do {
let response = try decoder.decode(Response.self, from: data)
print(response)
} catch {
print("Error decoding: \(error.localizedDescription)")
}
Poznámka: tento příklad je velmi nemilosrdné. Všechny chybějící hodnoty nebo typ, který není podporován, bude to vést k DecodingError
. Je to jen na vás, zjistit všechny možné typy, a to, co je povinné a co ne.
Také jsem nevěděla, dekódovat všechno ani nechci zvládnout date
objekt je naplno
To je jako json jde o velmi složitý příklad. Všechno, co v něm je polymorfní: date
, Scanner
, ScannerDetails
atd. Musíte být velmi opatrní, jak to dekódovat, a ujistěte se, že zvládnout všechny možnosti. Já bych naznačují, že pokud začínáte, měli byste prozkoumat jednodušší příklady.
Také jsem se rozhodla použít výčtové typy. Není to něco, co každý by si vybral, ale jeho moje preference pro dekódování polymorfní typy, jako jsou tyto.
Můžete si přečíst můj článek o jednání s polymorfní typy, stejně jako neznámé typy zde: https://medium.com/@jacob.sikorski/awesome-uses-of-swift-enums-2ff011a3b5a5