The YAJL framework is an Objective-C wrapper around the http://lloyd.github.com/yajl/ SAX-style JSON parser.
Source: http://github.com/gabriel/yajl-objc
View docs online: http://gabriel.github.com/yajl-objc/
YAJL C docs: http://lloyd.github.com/yajl/
To use the framework (for Mac OS X or iOS):
// For Mac OS X #import <YAJL/YAJL.h> // For iOS #import <YAJLiOS/YAJL.h>
NSData *JSONData = [NSData dataWithContentsOfFile:@"example.json"];
NSArray *arrayFromData = [JSONData yajl_JSON];
NSString *JSONString = @"[1, 2, 3]";
NSArray *arrayFromString = [JSONString yajl_JSON];
// With options and out error NSString *JSONString = @"[1, 2, 3] // Allow comments"; NSError *error = nil; NSArray *arrayFromString = [JSONString yajl_JSONWithOptions:YAJLParserOptionsAllowComments error:&error];
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"]; NSString *JSONString = [dict yajl_JSONString]; // ==> {"key":"value"}
// Beautified with custon indent string NSArray *array = [NSArray arrayWithObjects:@"value1", @"value2", nil]; NSString *JSONString = [dict yajl_JSONStringWithOptions:YAJLGenOptionsBeautify indentString:@" "];
NSData *data = [NSData dataWithContentsOfFile:@"example.json"]; YAJLParser *parser = [[YAJLParser alloc] initWithParserOptions:YAJLParserOptionsAllowComments]; parser.delegate = self; [parser parse:data]; if (parser.parserError) NSLog(@"Error:\n%@", parser.parserError); parser.delegate = nil; [parser release]; // Include delegate methods from YAJLParserDelegate - (void)parserDidStartDictionary:(YAJLParser *)parser { } - (void)parserDidEndDictionary:(YAJLParser *)parser { } - (void)parserDidStartArray:(YAJLParser *)parser { } - (void)parserDidEndArray:(YAJLParser *)parser { } - (void)parser:(YAJLParser *)parser didMapKey:(NSString *)key { } - (void)parser:(YAJLParser *)parser didAdd:(id)value { }
There are options when parsing that can be specified with initWithParserOptions: (YAJLParser).
YAJLParser *parser = [[[YAJLParser alloc] init] autorelease]; parser.delegate = self; // A chunk of data comes... YAJLParserStatus status = [parser parse:chunk1]; // 'status' should be YAJLParserStatusInsufficientData, if its not finished if (parser.parserError) NSLog(@"Error:\n%@", parser.parserError); // Another chunk of data comes... YAJLParserStatus status = [parser parse:chunk2]; // 'status' should be YAJLParserStatusOK if its finished if (parser.parserError) NSLog(@"Error:\n%@", parser.parserError);
To use the document style, use YAJLDocument. Usage should be very similar to NSXMLDocument.
NSData *data = [NSData dataWithContentsOfFile:@"example.json"]; NSError *error = nil; YAJLDocument *document = [[YAJLDocument alloc] initWithData:data parserOptions:YAJLParserOptionsNone error:&error]; // Access root element at document.root NSLog(@"Root: %@", document.root); [document release];
YAJLDocument *document = [[YAJLDocument alloc] init]; document.delegate = self; NSError *error = nil; [document parse:chunk1 error:error]; [document parse:chunk2 error:error]; // You can access root element at document.root NSLog(@"Root: %@", document.root); [document release]; // Or via the YAJLDocumentDelegate delegate methods - (void)document:(YAJLDocument *)document didAddDictionary:(NSDictionary *)dict { } - (void)document:(YAJLDocument *)document didAddArray:(NSArray *)array { } - (void)document:(YAJLDocument *)document didAddObject:(id)object toArray:(NSArray *)array { } - (void)document:(YAJLDocument *)document didSetObject:(id)object forKey:(id)key inDictionary:(NSDictionary *)dict { }
id JSONValue = [[NSBundle mainBundle] yajl_JSONFromResource:@"kegs.json"];
To implement JSON encodable value for custom objects or override for existing objects, implement - (id)JSON;
For example:
@interface CustomObject : NSObject @end @implementation CustomObject - (id)JSON { return [NSArray arrayWithObject:[NSNumber numberWithInteger:1]]; } @end