Parsing JSON with swift. An experiment in preparation for a new app. Parse JSON feed into object defined in struct. Extensions to Struct deal with initialisation – decode of JSON string and retreiving JSON from web server API.
Utilised by:
LaboratoryTest.laboratoryTests{laboratoryTests in self.laboratoryTestsDataSouce = laboratoryTests self.LaboratoryTestsTableView.dataSource = self DispatchQueue.main.async{ self.LaboratoryTestsTableView.reloadData() } }
import Foundation struct LaboratoryTest { let attributes: (analyteName: String, snomed: String?, readCode: String?) let id : Int let links: String? let type: String } enum SerializationError: Error { case missing(String) case invalid(String, Any) } extension LaboratoryTest: JSONDecodable { init?(JSON: Any) throws { guard let JSON = JSON as? [String: AnyObject] else { return nil } guard let analyteNameName = JSON["attributes"]?["analyte-name"] as? String else { return nil } guard let record_id = JSON["id"] as? String else { return nil } let snomodCode = JSON["attributes"]?["snomed"] ?? "Definitely Not Nil Variable" let readCodeCode = JSON["attributes"]?["read-code"] ?? "Definitely Not Nil Variable" let link = JSON["links"] ?? "Definitely Not Nil Variable" as AnyObject let typestr = JSON["type"] ?? "Definitely Not Nil Variable" as AnyObject self.attributes = (analyteName: analyteNameName, snomed: snomodCode as? String, readCode: readCodeCode as? String) self.id = Int(record_id)! self.links = link as? String self.type = typestr as! String } } extension LaboratoryTest { static func laboratoryTests(completion: @escaping (Array<Any>) -> ()) { let urlString = "https://api.reflabs.uk/api/v1/laboratory_tests/" let url = URL(string: urlString) URLSession.shared.dataTask(with:url!) { (data, response, error) in if error != nil { print(error ?? "No Error") } else { do { let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:Any] if let labTests = parsedData["data"] as? [[String:Any]] { var laboratoryTests: [LaboratoryTest] = [] for case let result in labTests { if let laboratoryTest = try LaboratoryTest(JSON: result) { laboratoryTests.append(laboratoryTest) } } completion(laboratoryTests) } } catch let error as NSError { print(error ) } } }.resume() } }