Couldn't Serialize NSData Objective C - ios

I couldnt serialize the following JSON data. I can't see anything wrong in it.
[{"id":2182,"title":"HEAVEN ON EARTH","content":"Description","post_date":"2014-07-28 09:29:45","post_modified":"2014-07-28 09:29:45","abc_featured":"","abc_rating":"0","abc_recommended":"","abc_phone":"","abc_address":"","abc_address2":"","abc_postcode":"","abc_suburb":"","abc_state":"NSW","abc_website":"http:\/\/","abc_email":"Pralead#hotmail.com","abc_lat":"-1000","abc_lon":"10000","abc_closed_txt":"","yes_event":"","from_event_date":"","to_event_date":"","abc_location":"","abc_age":"","abc_cost":"","abc_prebook":"","abc_parentaccompany":"","abc_changingfaciltiy":"","abc_playarea":"","abc_pramaccessibility":"","abc_breastfeedingarea":"","abc_refreshments":"","abc_inoutdoor":"","abc_parking":"","abc_freetrail":"","feature_name":null,"feature_value":null,"feature_available":[],"image1":"http:\/\/localhost\/wordpress\/wp-content\/uploads\/2014\/07\/IMG_0014.png","image2":"http:\/\/localhost\/wordpress\/wp-content\/uploads\/2014\/07\/IMG_0011.png","image3":"http:\/\/localhost\/wordpress\/wp-content\/uploads\/2014\/07\/IMG_0009.png","Monday_from_time":"","Monday_to_time":"","Tuesday_from_time":"","Tuesday_to_time":"","Wednesday_from_time":"","Wednesday_to_time":"","Thursday_from_time":"","Thursday_to_time":"","Friday_from_time":"","Friday_to_time":"","Saturday_from_time":"","Saturday_to_time":"","Sunday_from_time":"","Sunday_to_time":""}]
CODE TO SERIALIZE IS:
NSArray *jsonArray=[NSJSONSerialization JSONObjectWithData:_downloadedData options:NSJSONReadingAllowFragments error:&error];
_downloadedData is the data I am geting from the JSON API.
I CAN SEE THE DATA COMING THROUGH THE NSLOG.

At a minimum the JSON in the question has problems, the main one is "null" for the value of a dictionary item.
Ex: "feature_name":null.
NSDictionary values must be an object.
Is the JSON in the question a NSLog() of _downloadedData?

Related

JSONSerilazation not working while parsing JSON object

I am getting an error while parsing the NSData I got from a server.
I am unable get the NDIctinory.
I am getting the error "No string key for value in object"
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:[body dataUsingEncoding:NSUTF8StringEncoding]
options:kNilOptions
error:&error];
Could someone help me with this issue?
The error message says that in the object (that's what JSON calls a dictionary) there is a key that is not a string, i. e. a number or another object. This is invalid.
From RFC7159, 4:
An object structure is represented as a pair of curly brackets
surrounding zero or more name/value pairs (or members). A name is a
string.
Therefore you will have an invalid JSON. Change that, if possible. Aditionally you can post the whole JSON in your Q. (Not in a comment to this A.)

NSJSONSerialization encoding?

I'm trying to convert my NSDictionary to a json string and then send the data to my web api via HTTPBody (POST request). I convert my dictionary to json like this:
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];
What I found is that this above method, is not encoding my data (at least special characters like ampersand is not being handled). So the data received on the server side is a mess and I can't read it properly.
For more details on what is happening, assume the following dictionary:
"salutation":"Mrs."
"companyName":"T & F LLP"
"firstName":"Tania"
"country":"Canada"
This dictionary is converted to NSData using the above method and later used like this
[request setHTTPBody:nsDataFromJson];
What do I receive on the server side? I get this
{"contact":"{\"firstName\":\"Tania\",\"salutation\":\"Mrs.\",\"company\":\"Aird
I only get the data up to the special character & and I can only assume that this is happening because the first method I mentioned is not encoding special characters like the &
So I solved this (just for the time being) by converting the dictionary into a json string then replacing each & with %26 then creating NSData from this new string (with the special characters handled). Then I get the full body on my server.
So any idea how to properly handle this?
By the way, the same problem occurs if I use SBJSON too.
It has been 3 months, so I guess the problem must have been solved by now.
The reason the received JSON data is corrupted is because the parser interpreted & (ampersand) as a part of the URL address. Borrowing some codes from this link, I wrote this function to percent-encode & and a few other characters that may get confused:
+ (NSDictionary*) percentEncodeDictionayValues:(NSDictionary*) dict
{
NSMutableDictionary* edict=[NSMutableDictionary dictionaryWithDictionary:dict];
NSMutableCharacterSet* URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
[URLQueryPartAllowedCharacterSet removeCharactersInString:#"?&=#+/'"];
for(NSString* key in [dict allKeys])
{
if([dict[key] isKindOfClass:[NSString class]])
edict[key] = [dict[key] stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
}
return edict;
}
So you can preprocess your NSDictionary object with this function before feeding into NSJSONSerialization, and the received data will have & and other characters preserved.

iOS RestKit 0.2 What is the best way to parse local Json

I wave read many articles about parsing a json via an Http request but almost none answers the question about what is the most straight forward way to parse o local json string. I found some deferent solutions here Deserializing local NSString of JSON into objects via RestKit (no network download) some of them work some others don't. Is there any "official" RestKit support for local JSON string deserialization?
Fortunately Apple provides "NSJSONSerialization" class from iOS 5.0. to serialise your data.
Step 1 : convert your local JSON string to "NSData"
NSString *strLocalJSON = #"{data= "some data"}"; //just for ex. may not be valid one
NSData *dataJSON = [str dataUsingEncoding:NSUTF8StringEncoding];
Step2:
id jsonobject= [NSJSONSerialization JSONObjectWithData:dataJSON options:NSJSONReadingMutableContainers error:nil]; // resulting object may contain Dictionary or Array depends on your localjson
for further info refer https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html
If your JSON is in a file then you use a file:// NSURL when you create your RestKit object manager. Everything else works as normal.
If the JSON is already in code, then you should save it to a file, or why are you needing to do any mapping? Anyway, you could use a combination of NSJSONSerialization and RKMappingOperation.

Parsing JSON using NSJSONSerialization

I am currently going through the Pragmatic iOS 6 book, and am having trouble understanding the following line of code explained in chapter 3 under the section about GCD:
NSJSONSerialization *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
//... some code here
NSArray *tweets = (NSArray *) jsonResponse; //<-- this line
Is it saying that the NSJSONSSerialization object could automatically return an instance of NSSArray, which is then stored in the tweets? I checked the Apple docs, but only saw items on restrictions using NSJSONSerialization, but not what objects it could then get converted to.
Thanks!
NSJSONSerialization can take a chunk of JSON data and turn into objects and it can do the same in the other direction that is by taking objects and converting them into the JSON data.
For easy understanding of NSJSONSerialization and interaction with Twitter, i would recommend you to use THIS and THIS tutorials.
Hope this helps!

Issues getting json from webserver in iOS5

I have a app that receive a feed from a server through json.
I have been building it for iOS5, but in the last weeks testing with iOS6. I tested today with a iOS5 device, and everything crashed.
The code looks like this:
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:#"http://www.myserver.com/news.json"]];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
It worked without problems, but now it returns a null. The data is not null.
Cocoa error 3840 means
The data couldn’t be read because it has been corrupted. (No string
key for value in object around character 2.)
You should check your json with a validator like http://www.jsoneditoronline.org/ or http://jsonformatter.curiousconcept.com/
The issue was a duplicated key from the webserver. Now it works.
But it strange that the error is trigged in iOS5 and not in iOS6.

Resources