Parsing Json into array - iphone

I have the following JSon File,
[
{
"Var1": {
},
"Var2": "exemple 1",
"Var3": data,
"Var4": data,
"Var5": data,
"Var6": [
{
"Var7": {
},
"Var8": 25,
"Var9": 0,
"Var10": 0
},
{
"Var7": {
},
"Var8": 12,
"Var9": 1,
"Var10": 0
},
{
"Var7": {
},
"Var8": 12,
"Var9": 2,
"Var10": 0
}
],
"Var11": 300,
"Var12": data,
"Var13": 1,
"Var14": data,
"Var15": data,
"Var16": 2,
"Var17": data,
"Var18": data
},
]
I want to store the elements into an array so i could access them all. Should i now store every Variable in an array itself, and so have 16 arrays? and then access them? or is there any better way where i could store everything in one array?
I am using the following code to get one variable and get all its entities into one array :
NSString *strURL = [NSString stringWithFormat:#"MyUrl"];
NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]];
NSString *strResult = [[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding];
NSDictionary *json = [strResult JSONValue];
arrayToUse = [json valueForKeyPath:#"Var2"];
Using this code, i will have all the Var2 stored in one array :
arrayToUSe will have : [#"exemple 1", #"exemple 2 "];
Is there any better way than to store each entity with all its variable in an array ?
I desire to have : arrayToUse = [Var1,Var2,Var3,…];

Related

ios-json array parsing issue [closed]

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
}
]
}

regex to detect a pattern in a JSON string

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 *)]

Inserting JSON array into Sqlite iPhone

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.

Objective C Parsing JSON, Dictionary returns a NSCFString instead of NSArray

What I'm trying to do is take a JSON feed and then loop through the results. However I keep getting a string instead of an array when I get the object from the dictionary. Any ideas on what I'm doing wrong?
Here's the JSON:
[
{
"_id": "4f6d9a7c1d0b4900010007ee",
"geo_triggers": [
{
"_id": "4fc3e5fdc7234e0001000002",
"location": [1,1],
"longitude": "1",
"latitude": "1",
"radius": 1,
"location_name": "Test 1"
},
{
"_id": "4fc61f3762f53f0001000043",
"location": [-71.057673,42.355395],
"longitude": "-71.057673",
"latitude": "42.355395",
"radius": 1000,
"location_name": "Test2"
}
]
}
]
Here's the Objective C Code:
const char* className = class_getName([result class]);
NSLog(#"Result is a: %s", className);
NSLog(#"%#", result); //string
NSArray* json = [result objectForKey:#"result"]; //should be an array of dictionaries
NSLog(#"JSON Output: %#", json);
const char* className1 = class_getName([json class]);
NSLog(#"yourObject is a: %s", className1);
And here's the output:
Result is a: __NSDictionaryI
2012-10-10 17:15:15.165 App[12980:19d03] {
result = "[{\"_id\":\"4f6d9a7c1d0b4900010007ee\",\"geo_triggers\":[{\"_id\":\"4fc3e5fdc7234e0001000002\",\"location\":[1.0,1.0],\"longitude\":\"1\",\"latitude\":\"1\",\"radius\":1,\"location_name\":\"Test 1\"},{\"_id\":\"4fc61f3762f53f0001000043\",\"location\":[-71.057673,42.355395],\"longitude\":\"-71.057673\",\"latitude\":\"42.355395\",\"radius\":1000,\"location_name\":\"Test2\"}]}]";
}
2012-10-10 17:15:15.166 App[12980:19d03] JSON Output: [{"_id":"4f6d9a7c1d0b4900010007ee","geo_triggers":[{"_id":"4fc3e5fdc7234e0001000002","location":[1.0,1.0],"longitude":"1","latitude":"1","radius":1,"location_name":"Test 1"},{"_id":"4fc61f3762f53f0001000043","location":[-71.057673,42.355395],"longitude":"-71.057673","latitude":"42.355395","radius":1000,"location_name":"Test2"}]}]
2012-10-10 17:15:15.166 App[12980:19d03] yourObject is a: __NSCFString
2012-10-10 17:15:15.166 App[12980:19d03] -[__NSCFString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0xb331800
Your result variable points to a dictionary. The dictionary contains one key. That key is #"result". The value for that key is a string, #"[{\"_id\":\"4f6d9a7c1d0b4900010....
In other words, you haven't really deserialized your JSON. You need to take the value for key result and run it through a JSON deserializer.
First need to decode the result. The above is JSON so I would suggest doing this
If you don't already have it download JSONKit.h and include it in your project
Then you can either do
NSString* json = [result JSONString]; to see the output
OR
something like id jsonDict = [[JSONDecoder decoder] objectWithData:responseData];
After that you can do [jsonDict objectForKey:#"_id"]; ///etc

Obj-C / iPhone: NSArray question

I have an array that looks like this when printed via NSLog:
{
response = "Valid";
updates = (
{
string = "test";
integer = 3493;
},
{
string = "test2";
integer = 55454;
}
);
start-index = 0;
My question is how I can loop through through the "updates" array so that I may print the values for each "string" respectively.
Should be an easy "for" loop or something?
Dave
Assuming you NSLogged data has a type of NSDictionary with name data.
NSArray *updates = [data objectForKey:#"updates"];
for (NSDictionary *update in updates) {
NSLog(#"Update: %# - %#", [update objectForKey:#"string"], [update objectForKey:#"integer"]);
}