本編內(nèi)容均出自于:張羽婷_Laura
聽朋友介紹,YYModel是一位90年后用周末兩天的時(shí)間搭建完成的一套框架,今天學(xué)習(xí)了一下午,收獲不少,滿滿的驚喜,作者思緒很縝密,不得不佩服...
#import "ViewController.h"
#import "YYModel.h"
#import "Book.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSDictionary *dict = @{
@"n":@"Harry Pottery",
@"p": @(256),
@"ext" : @{
@"desc" : @"A book written by J.K.Rowing."
},
@"ID" : @(100010),
@"author":@{
@"name":@"J.K.Rowling",
@"birthday":@"1965-07-31T00:00:00+0000"
},
@"works":@[@"one",@"two",@"three"],
@"timestamp":@(1445534567)
};
//單模型,或者模型嵌套,都是只要一句代碼,會自動嵌套
Book *model = [[Book alloc]init];
[model yy_modelSetWithDictionary:dict];
NSLog(@"===============%@",model.name);
NSLog(@"+++++++++++++++%ld",model.page);
NSLog(@"--------------%@",model.author.name); //模型嵌套
}
#import "Book.h"
@implementation Book
/*
創(chuàng)建一個(gè)JSON的Key 與 Model屬性的映射列表
可以一對多、多對一、多對多
1、如果一個(gè)屬性沒有映射關(guān)系,那默認(rèn)會使用相同屬性名作為映射
2、在 json->model 的過程中:如果一個(gè)屬性對應(yīng)了多個(gè) json key,那么轉(zhuǎn)換過程會按順序查找,并使用第一個(gè)不為空的值。
3、在 model->json 的過程中:如果一個(gè)屬性對應(yīng)了多個(gè) json key (key path),那么轉(zhuǎn)換過程僅會處理第一個(gè) json key (key path);如果多個(gè)屬性對應(yīng)了同一個(gè) json key,則轉(zhuǎn)換過過程會使用其中任意一個(gè)不為空的值。
*/
//返回一個(gè) Dict,將 Model 屬性名對映射到 JSON 的 Key。
//創(chuàng)建映射表,主要是因?yàn)镴SON的Key與Model的屬性明不一致
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"name" : @"n",
@"page" : @"p",
@"desc" : @"ext.desc",
@"bookID" : @[@"id",@"ID",@"book_id"],
};
}
//返回容器類中的所需存放的數(shù)據(jù)類型(以Class或 Class Name 的形式)
+ (NSDictionary *)modelContainerPropertyGenericClass{
return @{
@"works":[NSString class], //聲明數(shù)組works中的元素都是字符串類型
};
}
//黑名單:在處理過程中會忽略該列表內(nèi)的所有屬性
+ (NSArray *)modelPropertyBlacklist{
//結(jié)果是:name屬性不會被賦值,其他正常
return @[@"name"];
}
//白名單: 在處理過程中不會處理該列表以外的屬性
+ (NSArray *)modelPropertyWhitelist{
//結(jié)果是:只會給name屬性賦值
return @[@"name"];
}
//當(dāng)JSON 轉(zhuǎn)為 Model 完成后,該方法會被調(diào)用
//可以在這里對數(shù)據(jù)進(jìn)行校驗(yàn),如果校驗(yàn)不通過,可以返回NO,則該Model會被忽略
//也可以在這里對一些自動轉(zhuǎn)換不能完成的工作,如數(shù)據(jù)格式更改
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic{
NSNumber *timestamp = dic[@"timestamp"];
if (![timestamp isKindOfClass:[NSNumber class]]) {
return NO;
}
//數(shù)據(jù)轉(zhuǎn)換
_timestamp = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];
return YES;
}
//當(dāng)Model 轉(zhuǎn)為 JSON 完成后,該方法會被調(diào)用
//可以在這里對數(shù)據(jù)進(jìn)行校驗(yàn),如果校驗(yàn)不通過,可以返回NO,則該Model 會被忽略
//也可以在這里做一些自動轉(zhuǎn)換不能完成的工作
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic{
return YES;
}
以上是部分代碼,完整的DEMO