- The sample code below shows how to get JSON encoded data via HTTP and then parse it for use within the application. For HTTP interaction, I am using SwiftHTTP (which I won’t be going into , for this post).
The code to parse JSON is done by a third party called SwiftyJSON which is available here: https://github.com/SwiftyJSON/SwiftyJSON
It is a single file which you can add to your Swift Project. I have made two functions in ViewController.swift which deals with the actual retrieving and parsing of the JSON data. JSON data is normally of one of the two types:
- Array of objects – example in func getJSONFeedAsArray
- Single Object – sample in func getJSONFeedAsObject
I am using public data repositories which provide data in the JSON format. You can check how the raw data looks for these urls:
https://api.github.com/users/hadley/orgs
https://www.bitstamp.net/api/ticker/
func getJSONFeedAsArray() { let url = "https://api.github.com/users/hadley/orgs" var data:String = "" do { let opt = try HTTP.GET(url) opt.start { response in if let err = response.error { print("error: \(err.localizedDescription)") return //also notify app of failure as needed } if let _ = response.data as NSData? { data = String(data: response.data, encoding: NSUTF8StringEncoding)! //parse JSON if let dataFromString = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { let json = JSON(data: dataFromString) // the data is an array of objects so get the count of items and iterate through each let count = json.count for (var i=0; i < count; i++) { let login = json[i]["login"].stringValue let id = json[i]["id"].intValue let url = json[i]["url"].stringValue let repos_url = json[i]["repos_url"].stringValue print(login) print (id) print (url) print (repos_url) print("-----------------") } // update UI in dispatch thread dispatch_async(dispatch_get_main_queue(),{ // update UI here }) } } // if let _ = response.data as NSData? } } catch let error { print("got an error creating the request: \(error)") } } func getJSONFeedAsObject() { let url = "https://www.bitstamp.net/api/ticker/" var data:String = "" do { let opt = try HTTP.GET(url) opt.start { response in if let err = response.error { print("error: \(err.localizedDescription)") return //also notify app of failure as needed } if let _ = response.data as NSData? { data = String(data: response.data, encoding: NSUTF8StringEncoding)! //parse JSON if let dataFromString = data.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) { let json = JSON(data: dataFromString) let high = json["high"].floatValue let last = json["last"].floatValue let timestamp = json["timestamp"].stringValue let bid = json["bid"].floatValue let vwap = json["vwap"].floatValue let volume = json["volume"].floatValue print(high) print (last) print (timestamp) print (bid) print (vwap) print (volume) print("-----------------") // update UI in dispatch thread dispatch_async(dispatch_get_main_queue(),{ // update UI here }) } } // if let _ = response.data as NSData? } } catch let error { print("got an error creating the request: \(error)") } }
Leave a Reply