Mantle能夠很方便的去書寫一個模型層的代碼。atom
使用它能夠很方便的去反序列化JSON或者序列化爲JSON(須要在MTLModel
子類中實現<MTLJSONSerializing>
協議)url
使用一個解釋器MTLJSONAdapter
去轉換模型對象。code
NSError *error = nil; MyObject *myObject = [MTLJSONAdapter modelOfClass:MyObject.class fromJSONDictionary:JSONDictionary error:&error]; //把JSONDictionary轉換爲模型對象 NSDictionary *JSONDictionary = [MTLJSONAdapter JSONDictionaryFromModel:myObject]; //將模型對象轉爲JSON字典
+JSONKeyPathsByPropertyKey
這個方法返回一個字典,指定着你的模型對象和JSON中關鍵字的映射關係。orm
一個例子:對象
@interface XYUser : MTLModel @property (readonly, nonatomic, copy) NSString *name; @property (readonly, nonatomic, strong) NSDate *createdAt; @property (readonly, nonatomic, assign, getter = isMeUser) BOOL meUser; @end @implementation XYUser + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @"createdAt": @"created_at", //這裏表明createdAt屬性映射JSON中的created_at關鍵字 @"meUser": NSNull.null //meUser不會從JSON中反序列化 }; } @end
當咱們用字典反序列化的時候get
NSDictionary *JSONDictionary = @{ @"name": @"john", @"created_at": @"2013/07/02 16:40:00 +0000", @"plan": @"lite" }; XYUser *user = [MTLJSONAdapter modelOfClass:XYUser.class fromJSONDictionary:JSONDictionary error:&error]; //user中的name爲john createdAt爲2013/07/02 16:40:00 +0000 meUser爲0 plan將會被忽略
+JSONTransformerForKey:
實現這個方法去用一個不同的類型轉換器去轉化屬性string
+ (NSValueTransformer *)JSONTransformerForKey:(NSString *)key { if ([key isEqualToString:@"createdAt"]) { return [NSValueTransformer valueTransformerForName:XYDateValueTransformerName]; } return nil; }
對於一些值的轉換:it
+ (NSValueTransformer *)createdAtJSONTransformer { return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) { return [self.dateFormatter dateFromString:str]; } reverseBlock:^(NSDate *date) { return [self.dateFormatter stringFromDate:date]; }]; }
+classForParsingJSONDictionary:
若是定義了一個類簇,能夠實現這個方法去轉換。io
@interface XYMessage : MTLModel @end @interface XYTextMessage: XYMessage @property (readonly, nonatomic, copy) NSString *body; @end @interface XYPictureMessage : XYMessage @property (readonly, nonatomic, strong) NSURL *imageURL; @end @implementation XYMessage + (Class)classForParsingJSONDictionary:(NSDictionary *)JSONDictionary { if (JSONDictionary[@"image_url"] != nil) { return XYPictureMessage.class; } if (JSONDictionary[@"body"] != nil) { return XYTextMessage.class; } NSAssert(NO, @"No matching class for the JSON dictionary '%@'.", JSONDictionary); return self; } @end
使用form
NSDictionary *textMessage = @{ @"id": @1, @"body": @"Hello World!" }; NSDictionary *pictureMessage = @{ @"id": @2, @"image_url": @"http://example.com/lolcat.gif" }; XYTextMessage *messageA = [MTLJSONAdapter modelOfClass:XYMessage.class fromJSONDictionary:textMessage error:NULL]; XYPictureMessage *messageB = [MTLJSONAdapter modelOfClass:XYMessage.class fromJSONDictionary:pictureMessage error:NULL];
MTLModel
已經遵循了<NSCoding>
協議,因此能夠NSKeyedArchiver
歸檔這個模型對象。