This question already has answers here:
Closed 10 years ago.
I am new in iPhone programming. Can anyone tell how parse the JSON string in iPhone?
I'm using JSON parsing in my application. This is my JSON data:
The JSON format is dz.
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address": {
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
}
}
How can I do this parsing?
You can use some JSON-Framework, i.e.
https://github.com/stig/json-framework
Another solution would be NSRegularExpression
Save the json Data in a string and then use the regex
For example an Regex for the first line
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:#"\"firstName\":[^\"]*\"([^\"]*)\"" options:0 error:&error];
NSArray *matches = [regex matchesInString:theString options:0 range:NSMakeRange(0, [theString length])];
NSTextCheckingResult *match = [matches objectAtIndex:0];
NSLog([theString substringWithRange:[match rangeAtIndex:1]]);
Explanation:
the regex looks for matches where you have "firstName": and then a variable number of signs except of "(because " inidicates where the data begins). ([^\"]) marks a specific range in the regex (so that you can extract it individually whit this line [theString substringWithRange:[match rangeAtIndex:1]]. [^\"] means every sign except "(because this is the end of data). I know this can be confusing at first. But If you take some time with it you will see that it's pretty easy.
Related
Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 9 years ago.
Improve this question
I have problem with this json data:
{"return":"{\"productsList\":
[{\"BrandUID\":0,\"BrandName\":\"KAIREE\",\"ProductUID\":213,\"ProductName\":\"ANARKALI NET
WITH BANARASI
INNER\",\"Address\":\"\",\"Email\":\"\",\"Phone\":\"\",\"Price\":\"15000.00\",\"MainImage\":
\"http:\\\/\\\/tagin.xspl.in:8888\\\/images\\\/medium\\\/IMG_2635.JPG\",\"TagCount\":0},
{\"BrandUID\":0,\"BrandName\":\"KAIREE\",\"ProductUID\":245,\"ProductName\":\"SILK CHOODIDAR
SUIT\",\"Address\":\"\",\"Email\":\"\",\"Phone\":\"\",\"Price\":\"5195.00\",\"MainImage\":\
"http:\\\/\\\/tagin.xspl.in:8888\\\/images\\\/medium\\\/IMG_2696.JPG\",\"TagCount\":0},
{\"BrandUID\":0,\"BrandName\":\"ROOP SANGAM\",\"ProductUID\":124,\"ProductName\":\"KOTA
SILK\",\"Address\":\"\",\"Email\":\"\",\"Phone\":\"\",\"Price\":\"1050.00\",\"MainImage\":\"
http:\\\/\\\/tagin.xspl.in:8888\\\/images\\\/medium\\\/DSC_0181.JPG\",\"TagCount\":0}]}"}
can please some help me...I want array of image urls i.e of keys MainImage.
How can I do it using NSJSONSerialization
This looks like "nested JSON": the value of the "return" key is a string that itself
contains a complete JSON object. In that case you have to de-serialize twice,
something like this:
NSData *jsonData = ... // your JSON data
NSError *error;
NSDictionary *outerObject = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error: &error];
NSData *innerJson = [outerObject[#"return"] dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *innerObject = [NSJSONSerialization JSONObjectWithData:innerJson options:0 error:&error];
And now you can access the inner JSON object, for example:
NSArray *productsList = innerObject[#"productsList"];
NSArray *mainImages = [productsList valueForKey:#"MainImage"];
Try this
id mainDict = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingAllowFragments error:&parseError];
Note:- here data is your response coming from server.
Now when you saw carefully above JSON data, the things wrapped inside {(curly bracket) are in the form of dictionary. And the things that are wrapped inside [(square bracket)are in the form of array.
So you can parse your data by following code,as our data is in maindict
NSArray *array = [[maindict valueForKey:#"return"]valueForKey:#"productsList"]];
Now when you print array you will get 3 elements in array.
Are you sure your JSON data is valid?
For example, this is valid JSON
{"\"key\"": "value"}
This is not:
{\"key\": "value"}
Please check the JSON data, i have modified, with extra "}"
{
"productsList": [
{
"BrandUID": 0,
"BrandName": "KAIREE",
"ProductUID": 213,
"ProductName": "ANARKALINETWITHBANARASIINNER",
"Address": "",
"Email": "",
"Phone": "",
"Price": "15000.00",
"MainImage": "http: //tagin.xspl.in: 8888/images/medium/IMG_2635.JPG",
"TagCount": 0
},
{
"BrandUID": 0,
"BrandName": "KAIREE",
"ProductUID": 245,
"ProductName": "SILKCHOODIDARSUIT",
"Address": "",
"Email": "",
"Phone": "",
"Price": "5195.00",
"MainImage": "http: //tagin.xspl.in: 8888/images/medium/IMG_2696.JPG",
"TagCount": 0
},
{
"BrandUID": 0,
"BrandName": "ROOPSANGAM",
"ProductUID": 124,
"ProductName": "KOTASILK",
"Address": "",
"Email": "",
"Phone": "",
"Price": "1050.00",
"MainImage": "http: //tagin.xspl.in: 8888/images/medium/DSC_0181.JPG",
"TagCout": 0
}
]
}
I have a string like this
"Settings" : { "UserId" : 3, "UserToken" : "4578965235874158", "SecurityCode" : "111", "Password" : "12345", "UserPhone" : "555-555-1531", "drop" : -1, "UserLastName" : "Smith" }
I need a regular expression pattern to find the value of the "UserToken"( in this example 4578965235874158)
Sorry if this is a "Give me code" question, but I never worked with regular expressions and I do not have much time to learn and try to do it myself.
Thanks for help.
Additional notes:
I will use it in objective-C for an iPhone application. I don't know if that affect anything but just in case.
EDIT'
The pattern is: the key is always "UserToken" followed by a space then by a : then another space after that comes the value inside double Quotes ". I would like to get this value.
Since it's a json format you don't really need to parse it with regex, but if you need to, this can be a solution:
(?<="UserToken"\s:\s")\d+
I would have converted it and access all information I need like:
NSString *str = #"\"Settings\" : { \"UserId\" : 3, \"UserToken\" : \"4578965235874158\", \"SecurityCode\" : \"111\", \"Password\" : \"12345\", \"UserPhone\" : \"555-555-1531\", \"drop\" : -1, \"UserLastName\" : \"Smith\" }";
//NSDictionary *jsonDict = [str JSONValue];
NSError *error;
NSData *jsonData = [str dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
than all information are stored on the results NSDictionary, just have to do something like: [results valueForKey:(NSString *)] or [results objectForKey::(NSString *)]
I have string like this:
jsonArray:
{
d = "[{\"Training_Code\":\"1234 \",\"Training_Duration\":\"2hrs \",\"Training_Startdate\":\"14/02/2013 15:00:00\",\"Training_Enddate\":\"14/02/2013 17:00:00\",\"Trainer_ID\":1,\"Training_Location\":\"B-Wing Training room-4\",\"Comments\":\"C# training\",\"Keyword\":\"C#1234\",\"NumberofDays\":1},{\"Training_Code\":\"4321 \",\"Training_Duration\":\"16 \",\"Training_Startdate\":\"17/02/2013 10:30:00\",\"Training_Enddate\":\"17/02/2013 17:30:00\",\"Trainer_ID\":2,\"Training_Location\":\"A-Wing Training Room-6\",\"Comments\":\"Objective-C\",\"Keyword\":\"Obj-C4321\",\"NumberofDays\":2}]";
}
I want to get the data between two square bracket(including square bracket) and then remove all the "\" to get my final string like this:
[
{
"Training_Code": "1234",
"Training_Duration": "2hrs",
"Training_Startdate": "14/02/201315: 00: 00",
"Training_Enddate": "14/02/201317: 00: 00",
"Trainer_ID": 1,
"Training_Location": "B-WingTrainingroom-4",
"Comments": "C#training",
"Keyword": "C#1234",
"NumberofDays": 1
},
{
"Training_Code": "4321",
"Training_Duration": "16",
"Training_Startdate": "17/02/201310: 30: 00",
"Training_Enddate": "17/02/201317: 30: 00",
"Trainer_ID": 2,
"Training_Location": "A-WingTrainingRoom-6",
"Comments": "Objective-C",
"Keyword": "Obj-C4321",
"NumberofDays": 2
}
]
How can I do this in objective-c? thanks.
Try using JSONKit(ref) or NSJSONSerialization (ref), they will give either an NSArray or NSDictionary, depending on the structure of the JSON string.
UPDATE:
d looks like a well formed JSON string, but where is it coming from? Is it a char[] (as mentioned in the coments above), NSString, or console output?
It looks from here that your first code listing is what gets printed to the console. Printing JSON strings to the console will usually print the escape characters (\). In your other post, you are assuming every response can be parsed into an array. It would be safer to store the returned object into an id first, then check its class:
id rawData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError
if ( jsonParsingError != nil ) {
// investigate the parsing error
}
else if ( [rawData isKindOfClass[NSDictionary class]] ) {
NSDictionary *dict = rawData;
// process dictionary
}
else if ( [rawData isKindOfClass[NSArray class]] ) {
NSArray *array = rawData;
// process array
}
else {
// some thing went completely wrong
}
You also do not indicate that you are checking any possible errors. Inspecting jsonParsingError will likely give clues as to what is going on.
Use nsstring method dataUsingEncoding to get a nsdata instance.
Use NSJSONSerialization
The string you wanted is same as you provided.
Since d is a string:
To remove "\" , you could this:
NSString *newString = [myString stringByReplacingOccurrencesOfString:#"\" withString:#""];
Since the square brackets are at the front and the end, maybe you could do this:
[newString removeObjectAtIndex:0];
[newString removeObjectAtIndex:[newString count]-1];
first step is to get that string according to your situation and replace myString with your string.
Only if the source string contains one [ and ] each, then...
Use componentsSeparatedByString to split the source string with [.
Use componentsSeparatedByString to split the result (objectAtIndex:0) above with ].
I'm getting JSON data like following in a NS array:
It seems this is not valid JSON
jsonArray:
{
d = "[{\"Training_Code\":\"1234 \",\"Training_Duration\":\"2hrs \",\"Training_Startdate\":\"14/02/2013 15:00:00\",\"Training_Enddate\":\"14/02/2013 17:00:00\",\"Trainer_ID\":1,\"Training_Location\":\"B-Wing Training room-4\",\"Comments\":\"C# training\",\"Keyword\":\"C#1234\",\"NumberofDays\":1},{\"Training_Code\":\"4321 \",\"Training_Duration\":\"16 \",\"Training_Startdate\":\"17/02/2013 10:30:00\",\"Training_Enddate\":\"17/02/2013 17:30:00\",\"Trainer_ID\":2,\"Training_Location\":\"A-Wing Training Room-6\",\"Comments\":\"Objective-C\",\"Keyword\":\"Obj-C4321\",\"NumberofDays\":2}]";
}
I want to change this to valid json like this:
[
{
"Training_Code": "1234",
"Training_Duration": "2hrs",
"Training_Startdate": "14/02/201315: 00: 00",
"Training_Enddate": "14/02/201317: 00: 00",
"Trainer_ID": 1,
"Training_Location": "B-WingTrainingroom-4",
"Comments": "C#training",
"Keyword": "C#1234",
"NumberofDays": 1
},
{
"Training_Code": "4321",
"Training_Duration": "16",
"Training_Startdate": "17/02/201310: 30: 00",
"Training_Enddate": "17/02/201317: 30: 00",
"Trainer_ID": 2,
"Training_Location": "A-WingTrainingRoom-6",
"Comments": "Objective-C",
"Keyword": "Obj-C4321",
"NumberofDays": 2
}
]
Note: I do not know, from where this "d" is comming...Plaese suggest keeping this in mind.
How can I change to valid json and insert this in my Sqlite DB? Thanks.
You can always inset it as plain text. If you want to manipulate JSON Strings, I recommend this. You can transform that String into a JKArray (which is the same than an Array). After that, iterate through your array and do your DB stuff (inserting into your table...)
Am I missing something? Maybe I need more info about what you want to do...
That's a string containing an encoded JSON array. You need to use a JSON decoder (batteries included as of iOS 5) to convert it into an NSArray, then walk it:
The following (untested) code should be about right:
// Assuming jsonArray is an object with an NSString property, d...
NSData *data = [jsonArray.d dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSArray *d = [NSJSONSerialization JSONObjectWithData:data options:0 error:err];
// Check for errors.
for (NSDictionary *row in d) {
NSString *trainingCode = [row objectForKey:#"Training_Code"];
…
// Insert into SQLite here.
}
Note that, in recent versions of Xcode, you can write row[#"Training_Code"] instead of [row objectForKey:#"Training_Code"].
Parse your json using NSJSONSerialization and insert into database by mapping keys with your columns.
NSString *str = [[NSString alloc] initWithString:#"[{\"Training_Code\":\"1234 \",\"Training_Duration\":\"2hrs \",\"Training_Startdate\":\"14/02/2013 15:00:00\",\"Training_Enddate\":\"14/02/2013 17:00:00\",\"Trainer_ID\":1,\"Training_Location\":\"B-Wing Training room-4\",\"Comments\":\"C# training\",\"Keyword\":\"C#1234\",\"NumberofDays\":1},{\"Training_Code\":\"4321 \",\"Training_Duration\":\"16 \",\"Training_Startdate\":\"17/02/2013 10:30:00\",\"Training_Enddate\":\"17/02/2013 17:30:00\",\"Trainer_ID\":2,\"Training_Location\":\"A-Wing Training Room-6\",\"Comments\":\"Objective-C\",\"Keyword\":\"Obj-C4321\",\"NumberofDays\":2}]"];
NSError *jsonError = nil;
id allValues = [NSJSONSerialization JSONObjectWithData:[str dataUsingEncoding:NSUTF8StringEncoding]
options:0
error:&jsonError];
if(jsonError!=nil)
InfoLog(#"error: %#",jsonError);
NSArray *result = (NSArray*)allValues;
for(int i=0;i<[result count];i++)
{
NSDictionary *values = (NSDictionary*)[result objectAtIndex:i];
NSLog(#"Training_Code: %# Training_Duration: %#",[values objectForKey:#"Training_Code"],[values objectForKey:#"Training_Duration"]);
}
Now you are able to get values from NSDictionary and then simply add in your database.
AM getting below error while converting json response into NSdictionary in json parsing...
ERROR:-JSONValue failed. Error trace is: (
Error Domain=org.brautaset.JSON.ErrorDomain Code=3 UserInfo=0x4d38270 "Unrecognised leading character"
)
any suggestion...
You most likely have the same issue as me... The returning data is in JSONP format instead of pure JSON. In other words you will be dealing with something like
functionCall({"Name": "Foo", "Id" : 1234, "Rank": 7});
instead of just
{"Name": "Foo", "Id" : 1234, "Rank": 7}
More info here
You'll need to strip the function and parentheses from the string before parsing it through the JSON Framework. You can do that with the following Regular Expression (spaced out to make it easier to see):
\w+ \s? \( ( \{ .* \} ) \}
And the script to write this is:
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:#"\\w+\\s?\\((\\{.*\\})\\)"
options:NSRegularExpressionCaseInsensitive
error:&error];
[regex replaceMatchesInString:resultString
options:0
range:NSMakeRange(0, [resultString length])
withTemplate:#"$1"];
NSLog(#"resultString = %#", resultString);
NSLog(#"converted = %#", [resultString JSONValue]);
where resultString is the response from the url request... It has to be stored as an NSMutableString in order for the regex to update it.
actually am not creating the json object by using api am retrieving it..
now i found the reason for that error. am not giving valid json object to covert into nsdictionary...So for getting valid json object we have to produce valid url to retrieve json object.
thanks for your suggestion...