post data and get data from json url in swift? - ios

I tried the below code for post and get data from json, in struck in getting data from json
http://beta.json-generator.com/api/json/get/EJoC6gB_z
[
{
"UserRole": "User",
"UserName": "Trinadh Reddy",
"Id": 15,
"Email": "trinadhvidavaluru#gmail.com"
},
{
"UserRole": "User",
"UserName": "fayaz sk",
"Id": 16,
"Email": "fayaz.net717#gmail.com"
},
{
"UserRole": "NewUser",
"UserName": "Gowtham M",
"Id": 17,
"Email": "mgowtham666#gmail.com"
},
{
"UserRole": "User",
"UserName": "fayaz sk",
"Id": 18,
"Email": "fayaz8484#gmail.com"
},
{
"UserRole": "NewUser",
"UserName": null,
"Id": 19,
"Email": null
},
{
"UserRole": "User",
"UserName": null,
"Id": 20,
"Email": null
},
{
"UserRole": "NewUser",
"UserName": "Fayaz Shaik",
"Id": 21,
"Email": "fayaz717#gmail.com"
},
{
"UserRole": "NewUser",
"UserName": "Trinadh Reddy",
"Id": 22,
"Email": "trinadh.engineer#gmail.com"
},
{
"UserRole": "NewUser",
"UserName": "tarun gandham",
"Id": 23,
"Email": "gandham.tarun#gmail.com"
},
{
"UserRole": "NewUser",
"UserName": null,
"Id": 24,
"Email": "admin#gmail.com"
},
{
"UserRole": "NewUser",
"UserName": "John",
"Id": 25,
"Email": "john#gmail.com"
},
{
"UserRole": "NewUser",
"UserName": "venkatesh kakumani",
"Id": 26,
"Email": "veenkys01#gmail.com"
}
]
code:
let givenName = user.profile.name
let email = user.profile.email
let param=["UserName":givenName!,"Email":email!] as Dictionary<String,String>
let request = NSMutableURLRequest(url: NSURL(string:"http://sstarapiservice.azurewebsites.net/api/users/")! as URL)
let session = URLSession.shared
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.httpBody = try! JSONSerialization.data(withJSONObject: param, options: [])
let task = session.dataTask(with: request as URLRequest) { data, response, error in
guard data != nil else {
print("no data found: \(error)")
return
}
do {
if let json = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary {
print("Response: \(json)")
if var role = json["UserRole"] as AnyObject? as! String?
{
print("assigned Role= \(role)")
if role == "User"{
print("App permissions approved")
let myStoryBoard:UIStoryboard = UIStoryboard(name:"Main",bundle:nil)
let page=myStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
let pageNav = UINavigationController(rootViewController:page)
let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController=pageNav
self.window?.rootViewController=pageNav
//self.window?.rootViewController = page
}
else{
print("wait for Approval...")
let myStoryBoard:UIStoryboard = UIStoryboard(name:"Main",bundle:nil)
let page=myStoryBoard.instantiateViewController(withIdentifier: "ApprovalUser") as! HomeViewController
let pageNav = UINavigationController(rootViewController:page)
let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController=pageNav
self.window?.rootViewController=pageNav
// let myStoryBoard:UIStoryboard = UIStoryboard(name:"Main",bundle:nil)
// let page=myStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
// let pageNav = UINavigationController(rootViewController:page)
// let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
// appDelegate.window?.rootViewController=pageNav
// self.window?.rootViewController=pageNav
//self.window?.rootViewController = page
}
}
//
}
else {
var jsonStr = " "
var jsonDictionary = [String: Any]()
jsonStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) as! String
print("Error could not parse JSON: \(jsonStr)")
print("121")
if var role = jsonStr as String?{
print("role= \(role)")
}
var role = JSONDict["UserRole"] as AnyObject? as! String?
print("success = \(role)")
// if var role = jsonDictionary["UserRole"] as! String?
// {
// print("role is:\(role)")
// }
let myStoryBoard:UIStoryboard = UIStoryboard(name:"Main",bundle:nil)
let page=myStoryBoard.instantiateViewController(withIdentifier: "HomeViewController") as! HomeViewController
let pageNav = UINavigationController(rootViewController:page)
let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.window?.rootViewController=pageNav
self.window?.rootViewController=pageNav
}
} catch let parseError {
print(parseError)// Log the error thrown by `JSONObjectWithData`
let jsonStr = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
print("Error could not parse JSON: '\(jsonStr)'")
print("12")
}
}
task.resume()

Request JSON data from Webservice APi in Swift 3
Here i have added two types of Methods by Using Alamofire or URLSession : -
import UIKit
import Alamofire
class ViewController: UIViewController {
let urlString = "http://beta.json-generator.com/api/json/get/EJoC6gB_z"
override func viewDidLoad() {
super.viewDidLoad()
// Choose only one function here for calling webservice
getValueofUser()
//Or
getuserDetails()
}
//MARK: - By Using Alamofire
func getValueofUser(){
Alamofire.request(urlString, method: .get)
.responseJSON { response in
print("Success: \(response.result.isSuccess)")
switch response.result {
case .success:
self.successGetTermsData(response: response.result.value! as Any)
case .failure(let error):
print(error)
}
}
}
//MARK: - Or Use URLSession methods
func getuserDetails(){
let url = URL(string: urlString)
URLSession.shared.dataTask(with:url!) { (data, response, error) in
if error != nil {
print(error ?? "")
} else {
do {
let response = try JSONSerialization.jsonObject(with: data!, options: [])
self.successGetTermsData(response: response)
} catch let error as NSError {
print(error)
}
}
}.resume()
}
func successGetTermsData(response: Any){
let arrayOfDetails = response as? [[String: Any]] ?? []
// Do Something with the Array
//Here you will be get Array of User Related Details
let email = arrayOfDetails[0]["Email"] as? String ?? ""
let username = arrayOfDetails[0]["UserName"] as? String ?? ""
let Id = arrayOfDetails[0]["Id"] as? Int ?? 0
let UserRole = arrayOfDetails[0]["UserRole"] as? String ?? ""
print("Email ID -" ,email, "User Name -", username, "ID -",Id, "UserRole -", UserRole)
}
}
OutPut : -
Email ID - trinadhvidavaluru#gmail.com User Name - Trinadh Reddy ID - 15 UserRole - User

Related

How to parse this JSON response in Swift

I usually use this code to parse most of JSON responses
Before the code, here the JSON I need to get form it the "workspace"
{
"count": 1,
"next": null,
"previous": null,
"results": [{
"id": 307,
"email": "999#ios.net",
"firstName": "fighter",
"categories": [],
"workspace": 302,
"phone": "25485"
}]
}
here is my code:
func getWorkSpace() {
DispatchQueue.main.async {
let returnAccessToken: String? = UserDefaults.standard.object(forKey: "accessToken") as? String
print("UserDefaults Returned Access Token is: \(returnAccessToken!)")
let access = returnAccessToken!
let headers = [
"content-type": "application/x-www-form-urlencoded",
"cache-control": "no-cache",
"postman-token": "dded3e97-77a5-5632-93b7-dec77d26ba99",
"Authorization": "JWT \(access)"
]
let request = NSMutableURLRequest(url: NSURL(string: "https://v5/workspaces/")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error!)
} else {
if let dataNew = data, let responseString = String(data: dataNew, encoding: .utf8) {
print("--------")
print(responseString)
print("--------")
DispatchQueue.main.async {
do {
let json = try JSON(data: data!, options: .allowFragments)
let answer = json["results"]
let workspace = Int(answer["workspace"].int!)
// let workspace = Int(answer["workspace"].string!)!
// let workspace = answer["workspace"].int!
print("Workspace is: \(workspace)")
} catch {
print("Error saving workspace!")
}
}
}
}
})
dataTask.resume()
}
}
This code usually works for me, but this time it's not. Please don't suggest me to use Codables because I didn't learn them yet.
SwiftyJSON
do {
let json = try JSON(data: data1!)
let answer = json["results"].array
answer?.forEach {
print($0["workspace"].int!)
}
} catch {
print("Error saving workspace!")
}
JSONSerialization
let json = try! JSONSerialization.jsonObject(with:data, options :[]) as! [String:Any]
let results = json["results"] as! [[String:Any]]
results.forEach {
print($0["workspace"] as! Int)
}
Codable
struct Root : Codable {
let results:[Model]
}
struct Model: Codable {
let id: Int
let email, firstName: String
let workspace: Int
let phone: String
}
let res = try! JSONDecoder().decode(Root.self, from:data)
print(res.results)

error when trying to post json to server Code=3840

am posting to server some data as json and getting json response from it .. like this:
let decoded4 = userDefaults.object(forKey: "nationalities") as! Data
let decodedNationalities = NSKeyedUnarchiver.unarchiveObject(with: decoded4) as! [Nationality]
for nationality in decodedNationalities {
if nationality.name == self.nationality {
idnationality = nationality.id
}
}
if conttype == "Single visit"{
conttype = "single_visit"
}else {
conttype = "multi_visit"
}
print(days)
if days.hasPrefix(","){
days.remove(at: days.startIndex)
}
if days.hasSuffix(","){
days.remove(at: days.endIndex)
}
let todosEndpoint: String = "my link"
guard let todosURL = URL(string: todosEndpoint) else {
print("Error: cannot create URL")
return
}
var todosUrlRequest = URLRequest(url: todosURL)
todosUrlRequest.httpMethod = "POST"
todosUrlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
let newTodo: [String: Any] = ["email": UserDefaults.standard.string(forKey: "CustomerEmail")!, "password": UserDefaults.standard.string(forKey: "CustomerPassword")!, "id_address": addid, "quantity_staff": maidn, "id_service": idservice, "id_region": idregion, "id_city": idcity, "id_nationality": idnationality, "start_date": "2018-05-09", "contract_type": "single_visit", "shift_type": "day", "weekdays": days, "starttime": starttime, "endtime": endtime]
print(newTodo)
let jsonTodo: Data
do {
jsonTodo = try JSONSerialization.data(withJSONObject: newTodo, options: [])
todosUrlRequest.httpBody = jsonTodo
} catch {
print("Error: cannot create JSON from todo")
return
}
let session = URLSession.shared
let task = session.dataTask(with: todosUrlRequest) {
(data, response, error) in
guard error == nil else {
print("error calling POST on /public/api/register_customer")
print(error!)
return
}
guard let responseData = data else {
print("Error: did not receive data")
return
}
// parse the result as JSON, since that's what the API provides
do {
guard let receivedTodo = try JSONSerialization.jsonObject(with: responseData,options: []) as? [String: Any] else {
print("Could not get JSON from responseData as dictionary")
return
}
print("The todo is: " + receivedTodo.description)
guard let status = receivedTodo["success"] as? Int else {
print("Could not get status from JSON")
return
}
if status == 0{
DispatchQueue.main.async {
self.performSegue(withIdentifier: "segueerr", sender: self)
}
print("The status is: 0")
guard let messages = receivedTodo["message"] as? String else {
print("Could not get messages from JSON")
return
}
print(messages)
}
else {
DispatchQueue.main.async {
self.performSegue(withIdentifier: "successsegue", sender: self)
}
print("Success!")
}
} catch {
print(error)
return
}
}
task.resume()
}
when i run it .. it posted the correct values which are:
["email": "lamatat#gmail.com", "id_service": 3, "id_region": 1,
"id_city": 3, "id_address": 22, "weekdays": "tue", "contract_type":
"single_visit", "id_nationality": 4, "password":
"4169faf51ce3c5fb8850451b441a363906f16d69", "endtime": 12,
"starttime": 8, "shift_type": "day", "quantity_staff": 1,
"start_date": "2018-05-09"]
i got error as response which is:
Error Domain=NSCocoaErrorDomain Code=3840 "No value." UserInfo={NSDebugDescription=No value.}
when am sure 100% of the values and tried the excat same one in postman and got this as result:
{
"success": true,
"message": "Adding new Order was successful.",
"id_order": 210,
"shift": {
"id": 31,
"id_region": 1,
"id_city": 3,
"id_nationality": 4,
"id_service": 3,
"shift_date": "2018-05-09 00:00:00",
"shift_type": "day",
"weekday": "tue",
"quantity_staff": 64,
"lead_hours": 10,
"created_at": "2018-05-07 12:54:48",
"updated_at": "2018-05-09 10:47:37",
"deleted_at": null,
"price_per_visit": 50
}
}
why would i got this error from the app?!
someone please help! i have no clue whats wrong!
Just try this instead for your one. Change this to
jsonTodo = try JSONSerialization.data(withJSONObject: newTodo, options: [])
to
let jsonTodo = JSONStringify(value: newTodo as AnyObject)
Add This method inside your controller
func JSONStringify(value: AnyObject,prettyPrinted:Bool = false) -> String{
let options = prettyPrinted ? JSONSerialization.WritingOptions.prettyPrinted : JSONSerialization.WritingOptions(rawValue: 0)
if JSONSerialization.isValidJSONObject(value) {
do{
let data = try JSONSerialization.data(withJSONObject: value, options: options)
if let string = NSString(data: data, encoding: String.Encoding.utf8.rawValue) {
return string as String
}
}catch {
print("error")
//Access error here
}
}
return ""
}
*But if you still facing same issue. Change your httoBody also like this
request.httpBody = jsonTodo.data(using: String.Encoding.utf8)

Parsing strange JSON - swift

I am starting my adventure with Swift and iOS developing. And I am fighting for few hours with parsing this json result:
[
[
{
"id": 289462,
"value": "24.80",
"taken_at": "2017-07-02 19:03:03",
"key": "temperature"
}
],
[
{
"id": 289463,
"value": "52.20",
"taken_at": "2017-07-02 19:03:05",
"key": "humidity"
}
]
]
It hasn't got this "name" before all of results, and I don't know, maybe this is causing errors? And below is my function to get data:
func get_data()
{
let headers = [
"content-type": "application/x-www-form-urlencoded",
"cache-control": "no-cache",
"postman-token": "fd20c3c4-650e-743c-3066-597de91f3873"
]
let postData = NSMutableData(data: "auth_key=32fd26f62677e7aa56027d9c228e1e9d6d96abc5d10f547dcb66e2a2f6ed13".data(using: String.Encoding.utf8)!)
let request = NSMutableURLRequest(url: NSURL(string: "http://192.168.0.22/last")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
// print(error)
} else {
//let httpResponse = response as? HTTPURLResponse
var keys = [String]()
do {
if let data = data,
let json = try JSONSerialization.jsonObject(with: data) as? [String: Any],
let mes = json[""] as? [[String: Any]] {
for me in mes {
if let name = me["key"] as? String {
keys.append(name)
}
}
}
} catch {
print("Error deserializing JSON: \(error)")
}
print(keys)
}
})
dataTask.resume()
}
I've tried several codes from different sites which I googled and still array is remaining empty :(
You're right the JSON is strange, the root object is [[Any]]. You can get the key values with
if let json = try JSONSerialization.jsonObject(with: data) as? [[Any]] {
for item in json {
if let firstItem = item.first as? [String:Any], let key = firstItem["key"] as? String {
keys.append(key)
}
}
}
However if the JSON was in much more suitable format
[
{
"id": 289462,
"value": "24.80",
"taken_at": "2017-07-02 19:03:03",
"key": "temperature"
},
{
"id": 289463,
"value": "52.20",
"taken_at": "2017-07-02 19:03:05",
"key": "humidity"
}
]
you could reduce the code to
if let json = try JSONSerialization.jsonObject(with: data) as? [[String:Any]] {
keys = json.flatMap { $0["key"] as? String }
}

Swift and JSON parsing only an object not an array

I am working on a weather app that parses JSON data and sets the text of my label to the temp value of the JSON request. I got the value of id from the weather object array, but the temp is not in an array it is just an object. Can someone please tell me where I am wrong. My value is reurning nil because I am not fetching it correctly. Here is my snippet and JSON.
#IBAction func getWeather(sender: AnyObject) {
let requestURL: NSURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=MYAPPID")!
let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL)
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithRequest(urlRequest) {
(data, response, error) -> Void in
let httpResponse = response as! NSHTTPURLResponse
let statusCode = httpResponse.statusCode
if (statusCode == 200) {
print("JSON Downloaded Sucessfully.")
do{
let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments)
if let today = json["weather"] as? [[String: AnyObject]] {
//this is pulling 4 key value pairs
for weather in today {
//this works
let id = weather["id"]?.stringValue
self.trumpDescription.text=id;
print(id)
//this is where I am confused it changes from an array to just an object
let temp = json["temp"] as? String
self.currentTempView.text=temp;
print(temp)
}
}
}
catch {
print("Error with Json: \(error)")
}
}
}
task.resume()
}`
Here is the JSON:
{
"coord": {
"lon": 138.93,
"lat": 34.97
},
"weather": [
{
"id": 803,
"main": "Clouds",
"description": "broken clouds",
"icon": "04n"
}
],
"base": "cmc stations",
"main": {
"temp": 292.581,
"pressure": 1019.48,
"humidity": 99,
"temp_min": 292.581,
"temp_max": 292.581,
"sea_level": 1028.92,
"grnd_level": 1019.48
},
"wind": {
"speed": 5.36,
"deg": 237.505
},
"clouds": {
"all": 64
},
"dt": 1464964606,
"sys": {
"message": 0.0037,
"country": "JP",
"sunrise": 1464895855,
"sunset": 1464947666
},
"id": 1851632,
"name": "Shuzenji",
"cod": 200
}
It looks like it should be
if let main = json["main"] as? NSDictionary {
let temp = main["temp"] as! String
print(temp)
}
Instead of this:
let temp = json["temp"] as? String
Try this:
if let main = json["main"] as? [String: AnyObject] {
let temp = main[temp]?.stringValue
print(temp)
//alternatively you can try this as per your convenience of data type
let tempNew = main[temp]?.doubleValue
print(tempNew)
}

NSJSONSerialization return nil with a valid json

I try to parse a response which return a valid JSON with NSJSonSerialization. But it returns nil with no error. It works with another JSON response.
I did some search, and this could be a problem with the encoding of the JSON. I don't know how to solve it. Any idea ?
let url: NSURL = NSURL(string: urlPath)!
self.searchRequest = NSMutableURLRequest(URL: url)
if let searchRequest = self.searchRequest {
searchRequest.HTTPMethod = "GET"
let authString : String = SNCF.APIKey + ":" + ""
let authData : NSData = authString.dataUsingEncoding(NSASCIIStringEncoding)!
let authValue : String = "Basic " + authData.base64EncodedStringWithOptions(.EncodingEndLineWithCarriageReturn)
searchRequest.setValue(authValue, forHTTPHeaderField: "Authorization")
let queue:NSOperationQueue = NSOperationQueue()
NSURLConnection.sendAsynchronousRequest(searchRequest, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
do {
//HERE JSONRESULT WILL BE NIL
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String: [AnyObject]] {
print("ASynchronous\(jsonResult)")
if let places = jsonResult["stop_areas"] as? [[String:AnyObject]]{
for placeDictionary in places {
if let labelText = placeDictionary["label"] as? String {
self.resultDatasource.append(labelText)
}
}
self.resultTableView.reloadData()
}
}
//HERE NO ERROR IS CATCHED
} catch let error as NSError {
print(error.localizedDescription)
}
})
Piece of my json response :
{
"disruptions": [],
"pagination": {
"start_page": 0,
"items_on_page": 100,
"items_per_page": 100,
"total_result": 3053
},
"stop_areas": [
{
"codes": [
{
"type": "CR-CI-CH",
"value": "0080-251967-BV"
}
],
"name": "gare de Perl",
"links": [],
"coord": {
"lat": "0",
"lon": "0"
},
"label": "gare de Perl",
"timezone": "Europe/Paris",
"id": "stop_area:OCE:SA:80251967"
},
{
...
},
//stop_areas dictionaries object...
], //end stop_areas array of dictionaries
"links": [
{
"href": "https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}",
"type": "stop_areas",
"rel": "stop_areas",
"templated": true
},
{
"href": "https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1",
"type": "next",
"templated": false
},
{
"href": "https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=30.52",
"type": "last",
"templated": false
},
{
"href": "https://api.sncf.com/v1/coverage/sncf/stop_areas",
"type": "first",
"templated": false
}
],
"feed_publishers": [
{
"url": "",
"id": "sncf",
"license": "",
"name": ""
}
]
}
The type of the JSON is [String: AnyObject] not [String: [AnyObject]]
I think this is the problem:
as? [String: [AnyObject]]
Try to remove the cast. If your JSON is correct and has no validation errors, the dictionary you get probably has the key value of type Any. You can try to use the dictionary by only casting the value keys you want:
if let jsonResult = try NSJSONSerialization.JSONObjectWithData(data!, options: nil) {
print("ASynchronous\(jsonResult)")
if let places = jsonResult["stop_areas"] as? [[String:AnyObject]] {
...
}
}
Try This
do {
if let jsonResult: Dictionary = try NSJSONSerialization.JSONObjectWithData(self.mutableData, options: NSJSONReadingOptions.MutableContainers) as? Dictionary<String, AnyObject>
{
// print("get Read messages == \(jsonResult)");
if ((jsonResult["Warning"]) != nil)
{
let error_by_wc: NSString = jsonResult["Warning"] as! String
//print("results == \(error_by_wc)");
// printMessage("\(error_by_wc)")
JLToast.makeText("\(error_by_wc)").show()
}else if((jsonResult["Error"]) != nil)
{
let error_by_wc: NSString = jsonResult["Error"] as! String
// print("results == \(error_by_wc)");
// printMessage("\(error_by_wc)")
JLToast.makeText("\(error_by_wc)").show()
}
else
{
// read message s
}
} catch {
print(error)
}
If Data is Array Type Use this code
do {
if let jsonResult:NSArray = try NSJSONSerialization.JSONObjectWithData(self.mutableData, options: .MutableContainers) as? NSArray {
//print(jsonResult)
aDataBase.insertFromUserImage(jsonResult)
connection_allMEssages()
}else
{
//print("not data found")
BProgressHUD.dismissHUD(0)
}
} catch {
print(error)
BProgressHUD.dismissHUD(0)
}

Resources