How do I parse JSON with Objective-C? How do I parse JSON with Objective-C? json json

How do I parse JSON with Objective-C?


With the perspective of the OS X v10.7 and iOS 5 launches, probably the first thing to recommend now is NSJSONSerialization, Apple's supplied JSON parser. Use third-party options only as a fallback if you find that class unavailable at runtime.

So, for example:

NSData *returnedData = ...JSON data, probably from a web request...// probably check here that returnedData isn't nil; attempting// NSJSONSerialization with nil data raises an exception, and who// knows how your third-party library intends to react?if(NSClassFromString(@"NSJSONSerialization")){    NSError *error = nil;    id object = [NSJSONSerialization                      JSONObjectWithData:returnedData                      options:0                      error:&error];    if(error) { /* JSON was malformed, act appropriately here */ }    // the originating poster wants to deal with dictionaries;    // assuming you do too then something like this is the first    // validation step:    if([object isKindOfClass:[NSDictionary class]])    {        NSDictionary *results = object;        /* proceed with results as you like; the assignment to        an explicit NSDictionary * is artificial step to get         compile-time checking from here on down (and better autocompletion        when editing). You could have just made object an NSDictionary *        in the first place but stylistically you might prefer to keep        the question of type open until it's confirmed */    }    else    {        /* there's no guarantee that the outermost object in a JSON        packet will be a dictionary; if we get here then it wasn't,        so 'object' shouldn't be treated as an NSDictionary; probably        you need to report a suitable error condition */    }}else{    // the user is using iOS 4; we'll need to use a third-party solution.    // If you don't intend to support iOS 4 then get rid of this entire    // conditional and just jump straight to    // NSError *error = nil;    // [NSJSONSerialization JSONObjectWithData:...}


Don't reinvent the wheel. Use json-framework or something similar.

If you do decide to use json-framework, here's how you would parse a JSON string into an NSDictionary:

SBJsonParser* parser = [[[SBJsonParser alloc] init] autorelease];// assuming jsonString is your JSON string...NSDictionary* myDict = [parser objectWithString:jsonString];// now you can grab data out of the dictionary using objectForKey or another dictionary method


NSString* path  = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"json"];//将文件内容读取到字符串中,注意编码NSUTF8StringEncoding 防止乱码,NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];//将字符串写到缓冲区。NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];NSError *jsonError;id allKeys = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONWritingPrettyPrinted error:&jsonError];for (int i=0; i<[allKeys count]; i++) {    NSDictionary *arrayResult = [allKeys objectAtIndex:i];    NSLog(@"name=%@",[arrayResult objectForKey:@"storyboardName"]);}

file:

 [  {  "ID":1,  "idSort" : 0,  "deleted":0,  "storyboardName" : "MLMember",  "dispalyTitle" : "76.360779",  "rightLevel" : "10.010490",  "showTabBar" : 1,  "openWeb" : 0,  "webUrl":""  },  {  "ID":1,  "idSort" : 0,  "deleted":0,  "storyboardName" : "0.00",  "dispalyTitle" : "76.360779",  "rightLevel" : "10.010490",  "showTabBar" : 1,  "openWeb" : 0,  "webUrl":""  }  ]