YAJL.framework is an Objective-C wrapper around the YAJL SAX-style JSON parser.
See Downloads
There are two options. You can install it globally in /Library/Frameworks or with a little extra effort embed it with your project.
- Copy
YAJL.framework
to/Library/Frameworks/
- In the target Info window, General tab:
- Add a linked library, under
Mac OS X 10.5 SDK
section, selectYAJL.framework
- Add a linked library, under
- Copy
YAJL.framework
to your project directory (maybe in MyProject/Frameworks/.) - Add the
YAJL.framekwork
files (from MyProject/Frameworks/) to your target. It should be visible as aLinked Framework
in the target. - Under Build Settings, add
@loader_path/../Frameworks
toRunpath Search Paths
- Add
New Build Phase
|New Copy Files Build Phase
.- Change the Destination to
Frameworks
. - Drag
YAJL.framework
into the the build phase - Make sure the copy phase appears before any
Run Script
phases
- Change the Destination to
To use the framework:
#import <YAJL/YAJL.h>
- Add the
YAJLIOS.framework
to your project. - Add the following frameworks to
Linked Libraries
:YAJLIOS.framework
CoreGraphics.framework
Foundation.framework
UIKit.framework
- Under 'Framework Search Paths' make sure the (parent) directory to YAJLIOS.framework is listed.
- Under 'Other Linker Flags' in the
Test
target, add-ObjC
and-all_load
To use the framework:
#import <YAJLIOS/YAJLIOS.h>
To parse JSON from an NSData (or NSString):
NSData *JSONData = [NSData dataWithContentsOfFile:@"example.json"];
NSArray *arrayFromData = [JSONData yajl_JSON];
NSString *JSONString = @"[\"Test\"]";
NSArray *arrayFromString = [JSONString yajl_JSON];
// With options and out error
NSError *error = nil;
NSArray *arrayFromString = [JSONString yajl_JSONWithOptions:YAJLParserOptionsAllowComments error:&error];
To generate JSON from an object:
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"];
NSString *JSONString = [dict yajl_JSONString];
// Beautified with custon indent string
NSArray *array = [NSArray arrayWithObjects:@"value1", @"value2", nil];
NSString *JSONString = [dict yajl_JSONStringWithOptions:YAJLGenOptionsBeautify indentString:@" "];
To use the streaming (or SAX style) parser, use YAJLParser
. For higher level (document) streaming, see below.
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 YAJLParser#initWithParserOptions:
.
YAJLParserOptionsAllowComments
: Allows comments in JSONYAJLParserOptionsCheckUTF8
: Will verify UTF-8YAJLParserOptionsStrictPrecision
: Will force strict precision and return integer overflow error, if number is greater than long long.
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) ...;
// Another chunk of data comes...
YAJLParserStatus status = [parser parse:chunk2];
// 'status' should be YAJLParserStatusOK if its finished
if (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
Then:
CustomObject *customObject = [[CustomObject alloc] init];
NSString *JSONString = [customObject yajl_JSON];
// JSONString == "[1]";