Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

YAJL Framework

The YAJL framework is an Objective-C framework for the YAJL SAX-style JSON parser.


  • Stream parsing, comments in JSON, better error messages.
  • Parse directly from NSString or NSData.
  • Generate JSON from default or custom types.
  • Properly handles large numeric types.
  • Document style parser.
  • Error by exception or out error.



pod "YAJLO"

Swift Package Manager

You can use The Swift Package Manager to install yajl-objc by adding the proper description to your Package.swift file:

// swift-tools-version:5.5
import PackageDescription

let package = Package(
    name: "YOUR_PROJECT_NAME",
    dependencies: [
        .package(url: "", from: "0.3.4"),


#import <YAJLO/NSObject+YAJL.h>
#import <YAJLO/YAJLDocument.h>
#import <YAJLO/YAJLGen.h>
#import <YAJLO/YAJLParser.h>

To parse JSON from NSData

NSData *JSONData = [NSData dataWithContentsOfFile:@"example.json"];
NSArray *arrayFromData = [JSONData yajl_JSON];

To parse JSON from NSString

NSString *JSONString = @"[1, 2, 3]";
NSArray *arrayFromString = [JSONString yajl_JSON];

To parse JSON from NSString with error and comments

// With options and out error
NSString *JSONString = @"[1, 2, 3] // Allow comments";
NSError *error = nil;
NSArray *arrayFromString = [JSONString yajl_JSONWithOptions:YAJLParserOptionsAllowComments error:&error];

To generate JSON from an object, NSArray, NSDictionary, etc.

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"];
NSString *JSONString = [dict yajl_JSONString];
// ==> {"key":"value"}

To generate JSON from an object, beautified with custom indent

// 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

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;

// 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 { }

Parser Options

There are options when parsing that can be specified with initWithParserOptions: (YAJLParser).

  • YAJLParserOptionsAllowComments: Allows comments in JSON
  • YAJLParserOptionsCheckUTF8: Will verify UTF-8
  • YAJLParserOptionsStrictPrecision: Will force strict precision and return integer overflow error, if number is greater than long long.

Parsing as data becomes available

 YAJLParser *parser = [[YAJLParser alloc] init];
 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);

Document style parsing

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 style parsing as data becomes available

 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);

 // 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 { }

Load JSON from Bundle

id JSONValue = [[NSBundle mainBundle] yajl_JSONFromResource:@"kegs.json"];

Customized Encoding

To implement JSON encodable value for custom objects or override for existing objects, implement - (id)JSON;

For example:

@interface CustomObject : NSObject

@implementation CustomObject

- (id)JSON {
 return [NSArray arrayWithObject:[NSNumber numberWithInteger:1]];



Objective-C bindings for YAJL (Yet Another JSON Library) C library







No packages published