JSONライブラリのYAJLを使ってみる

Objective-CJSONのデータを扱う場合にはJSON Frameworkを使うのが便利であるが、YAJLというライブラリもあると言うことで、こちらも試しに利用してみた。その使い方は以下。


[事前準備]
1. 必要なソースコードとライブラリの追加
GitHub - gabriel/yajl-objc: Objective-C bindings for YAJL (Yet Another JSON Library) C libraryからソースコードをダウンロードしてくるのだが、iPhone用のライブラリをダウンロードする(本日現在だとlibYAJLIPhone-0.2.13.zipというファイル)。そして、ダウンロードしたzipファイルを解凍し、中にあるヘッダファイルとライブラリを全てXCodeのプロジェクトに追加する。


2. プロジェクトの設定
ビルドの設定で「他のリンカフラグ」に-ObjC-all_loadを追加する。


以上で準備は終わりである。


[利用方法]
例としてTwitterのつぶやきをJSON形式で取得してきてパースする場合を示す。

#import "NSObject+YAJL.h"
- (void)getMyTweets {
    NSString *urlString = @"http://twitter.com/statuses/user_timeline/tomute.json";
    NSURL *url = [NSURL URLWithString:urlString];
    NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
   
    // YAJLを使ったJSONデータのパース処理 
    NSArray *jsonArray = [jsonString yajl_JSON];
    
    // つぶやきとつぶやいた時刻をダンプ
    for (NSDictionary *dic in jsonArray) {
        NSLog(@"%@", [dic objectForKey:@"text"]);
        NSLog(@"%@", [dic objectForKey:@"created_at"]);
    }
}


上記のようにJSON Frameworkとほぼ同じように利用できる(JSON Frameworkだとパース処理部分が以下のようになる)。

    NSArray *jsonArray = [jsonString JSONValue];


なお「http://rel.me/2009/10/08/json-parsing-speed-test-yajl-vs-sbjson-iphone/」という記事によると、YAMLの方が60%ほどスピードが早いそうなのだが、試しに自分のiPhone 3Gを使って上記のつぶやきのパース速度を比較してみた。

YAJL JSON Framework
1回目 0.14sec 0.24sec
2回目 0.09sec 0.17sec
3回目 0.09sec 0.17sec

結果としては確かにYAJLの方が早いという感じだったので、JSONデータのパース処理がボトルネックになっているというような場合には、YAJLの使用を検討してみるというのも良いかも知れない。


[備考]
ビルド時に以下のようなワーニングが出ていたのだが原因は究明出来ず。

ld: warning: _YAJLParserErrorCode has different visibility (default) in /Users/tomute/Documents/iPhoneAppDev/Test/YAJLTest/libYAJLIPhone-0/libYAJLIPhone.a(YAJLDocument.o) and (hidden) in /Users/tomute/Documents/iPhoneAppDev/Test/YAJLTest/build/YAJLTest.build/Debug-iphonesimulator/YAJLTest.build/Objects-normal/i386/YAJLTestAppDelegate.o


[関連記事]