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()
}
}