JSON String to Dictionary in Swift 4 - json

I'm getting response from server in JSON in this format.
{"ResponseCode":1,"StudentDetails":[{"Student_ID":1,"Student_SchoolID":1,"Student_BranchID":1,"Student_ClassID":1,"Student_FirstName":"1","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"19/03/2017","Student_EnrollmentNo":"1","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/IMG100710620180809104233860.JPG","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":278324,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Ganu now","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":267971,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":4894,"Student_FirstName":"Poonam Dillo saii","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"2211","Class_Name":"Nursery A","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/FB_IMG_145451330612110622062018203844.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":272466,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Poonam ganu","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":273560,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14564,"Student_FirstName":"Ganesh kumar saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"Primary","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":133262,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":5065,"Student_FirstName":"Lavish saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"04/02/2018","Student_EnrollmentNo":"09EEBMIT29","Class_Name":"KG ICA","Student_Password":"123456","Student_PrimaryEmailID":"ganeshsaini01#gmail.com","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/download110682201811024710015409877121411061541069294120.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0}],"StudentMenusCount":[{"CountValue":0,"StudentId":0,"CountFor":"StudyPlanner","DatabaseID":0,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0}]}
Now this I'm getting in JSON String format. I need to convert it to Dictionary. I'm using this code to parse json.
let myJson = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.allowFragments) as Any
if myJson is String {
print(myJson) // Printing Here as myJson is String.
}
If I'm writing in above code as:
let myJson = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: Any]
It's complaining about bad json than. Any idea of how to convert json string to Dictionary here?

This is the way to do it but you should say what is the error:
if let data = Data(result.utf8) {
do {
let myJson = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! [String: Any]
} catch let error {
print(error)
}
}

I think the JSON is fine, however the way you parse JSON is not.
I tried with this code and the result is expected.
let response = """
{"ResponseCode":1,"StudentDetails":[{"Student_ID":1,"Student_SchoolID":1,"Student_BranchID":1,"Student_ClassID":1,"Student_FirstName":"1","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"19/03/2017","Student_EnrollmentNo":"1","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/IMG100710620180809104233860.JPG","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":278324,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Ganu now","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":267971,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":4894,"Student_FirstName":"Poonam Dillo saii","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"2211","Class_Name":"Nursery A","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/FB_IMG_145451330612110622062018203844.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":272466,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14193,"Student_FirstName":"Poonam ganu","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"1 QA","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":273560,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":14564,"Student_FirstName":"Ganesh kumar saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"01/01/0001","Student_EnrollmentNo":"","Class_Name":"Primary","Student_Password":"123456","Student_PrimaryEmailID":"","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":false,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0},{"Student_ID":133262,"Student_SchoolID":1404,"Student_BranchID":1408,"Student_ClassID":5065,"Student_FirstName":"Lavish saini","Student_MiddleName":"","Student_LastName":"","Student_Gender":"Male","Student_DOB":"04/02/2018","Student_EnrollmentNo":"09EEBMIT29","Class_Name":"KG ICA","Student_Password":"123456","Student_PrimaryEmailID":"ganeshsaini01#gmail.com","SchoolLogo":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/branch/compress/images106472017105803.jpg","Student_IsProfileImageUpload":true,"Student_IsSoftDelete":false,"Student_IsActive":true,"Branch_Name":"1","ProfilePicture":"https://s3-us-west-2.amazonaws.com/1/uploadeddocs/student/compress/download110682201811024710015409877121411061541069294120.jpg","DatabaseID":106,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0}],"StudentMenusCount":[{"CountValue":0,"StudentId":0,"CountFor":"StudyPlanner","DatabaseID":0,"IsSMSDisabled":false,"SMSBalance":null,"SMSSettingID":0,"NotificationSettingID":0,"IsSuperAdminUser":false,"SelectedSessionMasterID":0,"TargetedDate":null,"SelectedSessionType":0}]}
"""
if let data = response.data(using: .utf8) {
let myJson = try JSONSerialization.jsonObject(with: data,
options: JSONSerialization.ReadingOptions.allowFragments) as Any
if myJson is String {
print(myJson) // <-- This will not print anything as myJson is not a string
}
if let dict = myJson as? [String: Any] {
print(dict.keys) // <-- This will print a list of keys
}
}

Related

Swift MacOS getting bad json response from jsonSerialization

I am trying to convert a string to JSON in Swift.
Here's the string, which I am getting by pulling the innerHTML from a WKWebView.
{"list":{"pagination":{"count":3,"hasMoreItems":false,"totalItems":3,"skipCount":0,"maxItems":100},"entries":[{"entry":{"createdAt":"2020-06-16T21:00:32.714+0000","isFolder":false,"isFile":true,"createdByUser":{"id":"UserFName.userLName#xxxxxxxx.com","displayName":"UserFName userLName"},"modifiedAt":"2020-06-16T21:00:32.714+0000","modifiedByUser":{"id":"UserFName.userLName#xxxxxxxx.com","displayName":"UserFName userLName"},"naxxxxxxxxme":"00-invest-2020-06-16-17-00-32-716.txt","id":"028b4c82-09b8-4ee5-b4fa-9696a33b026d","nodeType":"log:fileNode","content":{"mimeType":"text/plain","mimeTypeName":"Plain Text","sizeInBytes":609373,"encoding":"UTF-8"},"parentId":"ba647bfc-a889-4d91-9211-4220cfe7d90a"}},{"entry":{"createdAt":"2020-06-16T21:01:12.828+0000","isFolder":false,"isFile":true,"createdByUser":{"id":"UserFName.userLName#xxxxxxxx.com","displayName":"UserFName userLName"},"modifiedAt":"2020-06-16T21:01:12.828+0000","modifiedByUser":{"id":"UserFName.userLName#xxxxxxxx.com","displayName":"UserFName userLName"},"name":"00-monetize-2020-06-16-17-01-12-830.txt","id":"d6412e3a-fea5-4d4d-a962-d91cde294bc9","nodeType":"log:fileNode","content":{"mimeType":"text/plain","mimeTypeName":"Plain Text","sizeInBytes":996653,"encoding":"UTF-8"},"parentId":"ba647bfc-a889-4d91-9211-4220cfe7d90a"}},{"entry":{"createdAt":"2020-06-16T18:33:49.344+0000","isFolder":true,"isFile":false,"createdByUser":{"id":"UserFName.userLName#xxxxxxxx.com","displayName":"UserFName userLName"},"modifiedAt":"2020-06-16T18:34:49.211+0000","modifiedByUser":{"id":"UserFName.userLName#xxxxxxxx.com","displayName":"UserFName userLName"},"name":"20200616","id":"d881db96-ddcb-44ae-99e1-ffe3ac0c2810","nodeType":"cm:folder","parentId":"2fcf4c49-be4c-4f2c-a90b-654ae092c63e"}}]}}
I've checked the string in JSON Lint and it says it is valid.
Here's what I am doing in my code to convert it:
let strJSONLiteral = """
\(strJSON)
"""
//convert string to json
let data = strJSONLiteral.data(using: .utf8)!
do {
if let myJSON = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]
{
print(myJSON) // use the json here
} else {
print("bad json")
}
} catch let error as NSError {
print(error.localizedDescription)
}
The error is occurring in the JSONSerialization attempt. I'm getting nil for myJSON. Data check looked ok, has 1600+ bytes.
The top-level JSON is of type Dictionary while you're trying to decode an Array of Dictionary. To fix this
Replace:
if let myJSON = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [Dictionary<String,Any>]
With:
if let myJSON = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? Dictionary<String,Any>
Or you can just use [String: Any].
Add-on: You should probably do a bit of research on Codable and try to use it for these scenarios.

JSON Serialization error. Swift conversion error from api response to json

Data from Server:
{"status":{"id":5,"title_en":"Accepted By Restaurant","title_restaurant":"In progress","title_rider":"New","title_customer":"In progress","slug":"accepted_by_restaurant","active":1},"orderDetail":{"id":47,"user_customer_id":27,"user_restaurant_id":13,"user_rider_id":null,"coupon_data":null,"order_status_id":5,"cancelled_by":null,"order_description":"Dsadas","reason_for_cancellation":null,"order_type":"delivery","vat":0,"delivery_fee":0,"total":200,"rider_rating":null,"customer_rating":null,"restaurant_rating":null,"service_rating":null,"reviews":null,"created_at":"2019-11-29 12:38:11","order_status":{"id":5,"title_en":"Accepted By Restaurant","title_restaurant":"In progress","title_rider":"New","title_customer":"In progress","slug":"accepted_by_restaurant","active":1}}}
its a valid json I checked on validator.
but its getting invalid json in swift conversion: below is the code:
if (JSONSerialization.isValidJSONObject(dataR!)){
let jsonResponse = try JSONSerialization.data(withJSONObject: dataR!, options: .prettyPrinted)
if let response = jsonResponse as? [String: Any]{
Try this method to get Dictionary from json object.
func getDictionaryFromJsonString(dictString:String)-> [String: Any] {
do {
return try JSONSerialization.jsonObject(with:
dictString.data(using:
String.Encoding.utf8, allowLossyConversion: true)!, options:
JSONSerialization.ReadingOptions.allowFragments) as! Dictionary
} catch {
return [:]
}
}

Cannot convert Data to NSDictionary

I'm trying to convert data from URLSession to a NSDictionary but it fails when converting the data to dictionary.
Following:
let json = try? JSONSerialization.jsonObject(with: data!, options: [])
print(json ?? "NotWorking")
outputs
(
{
babyId = 1;
id = 17;
timestamp = "2018-06-30 09:23:27";
}
)
But when I try to convert it into a Dictionary with following it outputs nil.
let json = try? JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary
The webpage outputs
[{"id":"17","babyId":"1","timestamp":"2018-06-30 09:23:27"}]
Where does the error occurs?
[ ] means array in JSON. { } means dictionary. You have an array of dictionary. Note that when you print an array in Swift, you will see ( ).
Don't use NSArray or NSDictionary in Swift without a very clearly understood and specific reason. Use a Swift array and dictionary of the proper types.
Your code should be:
do {
if let results = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] {
// results is now an array of dictionary, access what you need
} else {
print("JSON was not the expected array of dictonary")
}
} catch {
print("Can't process JSON: \(error)")
}
And really you shouldn't be using data! either. Somewhere above this you should have a if let data = data {

Error while parsing JSON in Swift, [String:Any] won't work

I'm trying to parse this JSON in Swift 3, but it crashes.
Here's the code
do{
let data1: Data = try! Data(contentsOf: NSURL(string: "https://gist.githubusercontent.com/DesWurstes/00baf946bd6d27e7e9355bd6e9969230/raw/a0de898faea8ddedb11b0db516967d0666255633/gist.json") as! URL)
let jsono = try JSONSerialization.jsonObject(with: data1, options: []) as! [String: Any]
}catch{
// catch isn't used here.
}
Here's the error I get when it crashes:
Could not cast value of type '__NSArrayI' (0x7fffe9cb9c08) to 'NSDictionary' (0x7fffe9cba158).
It crashes because not all of the elements of the array are string. (The root of the JSON is an array.)
To prevent it from crashing, changing the third line with this will be suitable:
let jsono = try JSONSerialization.jsonObject(with: data1, options: [])
But then, its type will be Any and I won't be able to parse it with
let string = jsono["something"] as! [String: Any] // Type "Any" has no subscript members
and this code won't run:
if let array = jsono as? [String: Any] {
print("test") // Doesn't print
}
While trying to fix error in the first code, I thought this code may work (Because it says can't convert Array to Dictionary):
let jsono = try JSONSerialization.jsonObject(with: data1, options: []) as! [String]
but it results...
Could not cast value of type '__NSDictionaryI' (0x7fffe9cba108) to 'NSString' (0x7fffea072f38).
Then how can I parse this JSON?
It looks like the JSON response returned from server is an array containing dictionaries of type [String: Any] so you can do:
if let array = jsono as? [[String: Any]] {
print("test") // Will print
for dictionary in array {
print(dictionary["url"] as! String)
}
}
Here you can download the playground I've written to test it out.
you have parse array response so you need to type cast json as? [[String: Any]]..
if your response is dictonary then you need to parse like json as? [String: Any]
func Callservice()
{
let jsonUrlString = "url"
guard let url = URL(string: jsonUrlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else { return }
do {
let courses = try JSONDecoder().decode([Course].self, from: data)
self.arrayData = courses
print(courses)
} catch let jsonErr {
print("Error serializing json:", jsonErr)
}
}.resume()
}
struct course:decodable{
let name:string?
}

Issue with JSON and Swift - \u00c3\u00a9 é instead of é

I am trying to display some JSON data on my iOS app but I am having an issue with displaying it correctly using Swift.
When I use the normal JSONSerializer for \u00c3\u00a9 i get é but I want to display é. I don't understand if it is an issue with say using UTF-16 rather than UTF-8 or something else?
Does anyone have any suggestions how I would convert \u00c3\u00a9 straight to é in Swift, from a JSON received from an API.
Not sure which encoding you're using, but this code works for both .utf8 and .utf16:
let jsonString = "{\"foo\": \"áéíóú\"}"
let data = jsonString.data(using: .utf16)!
do {
let object = try JSONSerialization.jsonObject(with: data, options: [])
if let dict = object as? [AnyHashable: Any], let text = dict["foo"] as? String {
print("Extracted text: \(text)")
}
}
catch let e {
// TODO: Handle error
print("Error processing JSON: \(e)")
}
was the same problem. Necessary use this code, it works:
Alamofire.request(url, method: .get, parameters: params)
.responseJSON{ response in
guard let data = response.data else {return}
do {
let jsonResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! NSDictionary
let json = jsonResult["response_goods"] as! [[String:String]]
print(json) } catch let err as NSError {print(err)
}
}