2013年1月2日水曜日

JSONのモデルクラス化を強力にサポートする JSONModel

JSONデータとモデルクラスとの変換を行うライブラリ。

たとえば
@interface MyModel: JSONModel
@property (strong, nonatomic) NSString* id;
@property (strong, nonatomic) NSString* name;
@end
というクラスを用意しておけば
m = [[MyModel alloc] initWithString:*JSON文字列* error:NULL];
もしくは
m = [[MyModel alloc] initWithDictionary:json error:NULL];
とするだけで m.id や m.name にデータを詰めてくれる。

単に変換を行うだけでなく色々な便利機能が用意されている。




バリデーション(必須チェック)


キーの有無が自動的にチェックされて、必須キーがない場合は例外がスローされる。キーが必須かオプションかどうかの指定ができる。
//this property is required
@property (strong, nonatomic) NSString* string;
 
//this one's optional
@property (strong, nonatomic) NSNumber* number;


JSON-ObjC間の型キャスト


JSONの値を、モデルのプロパティの型に応じた値に変換して格納してくれる。

地味だがこれは便利。


データ変換


例えば
{
  "purchaseDate" : "2012-11-26T10:00:01+02:00",
  "blogURL" : "http://www.touch-code-magazine.com"
}
というJSONデータを扱う場合、
@interface SmartModel: JSONModel
 
@property (strong, nonatomic) NSDate* purchaseDate;
@property (strong, nonatomic) NSURL* blogUrl;
 
@end
というモデルを用意しておけば、W3Cの日付フォーマットの文字列が自動的に NSDateに変換される。

この仕組"data transformers" は上記のように標準で用意されているものの他、自分で定義することができる。以下は UIColor を扱う例。
@interface JSONValueTransformer(UIColor)
 
-(UIColor*)UIColorFromNSString:(NSString*)string;
-(id)JSONObjectFromUIColor:(UIColor*)color;
 
@end


カスケーディング(入れ子モデル)


こんなものもOK。
{
  "idImage": 1, 
  "name": "house.jpg", 
  "copyright": {"author":"Marin Todorov", "year":2012} 
}
@interface CopyModel: JSONModel
 
@property (strong, nonatomic) NSString* author;
@property (assign, nonatomic) int year;
 
@end
#import "CopyModel.h"
@interface ImageModel: JSONModel
 
@property (assign, nonatomic) int idImage;
@property (strong, nonatomic) NSString* name;
@property (strong, nonatomic) CopyModel* copyright;
 
@end

また配列を扱う場合、格納形を表すプロトコルを定義しておく。
@protocol TweetModel @end
その上で配列定義をこう書く。
@property (strong, nonatomic) NSArray<tweetmodel>* tweets;
このライブラリが配列に格納されたオブジェクトの型を明示するための単純なテクニック表記なのだが、Javaのジェネリクスぽくて面白い。


永続化


NSDictionaryとの相互変換をサポートしているので、NSDictionaryのそれが利用できる。
こんな感じ。
//load from file
NSDictionary* object = [NSDictionary dictionaryWithContentsOfFile:filePath];
 
//initialize model with data
data = [[MyDataModel alloc] initWithDictionary: object];
//save to disc
[[data toDictionary] writeToFile:filePath atomically:YES];


- - -
実際に使う場面を想定して良く考えられていて作られている。JSONを使う場面で結構便利に利用できると思われる。
なお付属のサンプルでは NSJSONSerializationと組み合わせて実際のネットワーク上のJSONデータ(YoutubeやGithubなど)を扱う例を見ることができる。

ライセンス:MIT

0 件のコメント:

コメントを投稿