JSONパーサ&ジェネレータのTouchJSONを使ってみる

本ブログでは以前にJSON FrameworkYAJLという2つのJSONパーサの使い方を記載したが、今回は新たにTouchJSONというJSONパーサ&ジェネレータの使い方を記載したいと思う。
ちなみにこのTouchJSONの開発グループはObjective-CXMLパーサであるTouchXML等も作っている。


[事前準備]
1. 必要なソースコードとライブラリの追加
Google Code Archive - Long-term storage for Google Code Project Hosting.からソースコードをダウンロードする(本日現在だとTouchJSON_1.0.7_Release.tar.bz2というファイルになる)。
ダウンロードしたtarファイルを解凍し、Sourceフォルダ配下のソースコードを全てXCodeのプロジェクトに追加する。
以上で事前準備は終了。非常に簡単である。


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

#import "CJSONDeserializer.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];
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
    
    // TouchJSONを使ったJSONデータのパース処理
    NSArray *jsonArray = [[CJSONDeserializer deserializer] deserializeAsArray:jsonData error:nil];

    // つぶやきとつぶやいた時刻をダンプ
    for (NSDictionary *dic in jsonArray) {
        NSLog(@"%@", [dic objectForKey:@"text"]);
        NSLog(@"%@", [dic objectForKey:@"created_at"]);
    }
}


ポイントとしてはJSON FrameworkやYAJLの場合と違って、NSStringではなくNSDataが必要である。
また、JSONの内容によってはNSDictionaryに展開される場合もあるのだが、この場合にはdeserializeAsArrayではなく、deserializeAsDictionaryメソッドを使用する。


参考までにJSON Framework、YAJL、TouchJSONのパース速度の比較を、自分のiPhone 3Gを使って実施してみた結果は以下(上記のTwitterのつぶやきをJSON形式で取得してきてパースするという処理の速度比較)。

YAJL JSON Framework TouchJSON
1回目 0.16sec 0.22sec 0.29sec
2回目 0.09sec 0.18sec 0.23sec
3回目 0.09sec 0.17sec 0.23sec


参考記事