序列化框架MJExtension详解 + iOS ORM框架
當(dāng)開(kāi)發(fā)中你的模型中屬性名稱(chēng)和 字典(JSON/XML) 中的key 不能一一對(duì)應(yīng)時(shí), 或者當(dāng)字典中嵌套了多層字典數(shù)組時(shí)..., 以及教你如何用 MJExtension 配置類(lèi)來(lái)統(tǒng)一管理你的模型配置, 下面羅列了開(kāi)發(fā)中常見(jiàn)的一些特殊情況, 請(qǐng)參考!(MJExtension/github)
- 最基本用法: // 將字典轉(zhuǎn)為模型
Person *p = [Person mj_objectWithKeyValues:dict2];
// 將 plist數(shù)據(jù)轉(zhuǎn)成模型數(shù)組
NSArrar *models = [Person mj_objectArrayWithFile:@"xx.plist"];
// 將字典數(shù)組轉(zhuǎn)成模型數(shù)組, 最常用
NSArrar *models = [Person mj_objectArrayWithKeyValuesArray:dict]
?
-
1 . 屬性名和關(guān)鍵字沖突, 我們需要變更屬性名, 比如 JSON 里是 id, 我們最好不要用 id, 又比如 discription, 和系統(tǒng)類(lèi)重名了
?
NSDictionary *dict = @{@"name":@"xiaofei",@"age":@24,@"id":@123456,@"description":@"haoshuai"}; 這時(shí)候我們屬性就不能命名 id, description 了, 得換一個(gè) // person.h @interface Person : NSObject @property(nonatomic, strong) NSString * name; @property(nonatomic, assign) NSInteger age; @property(nonatomic, strong) NSString * descrip; @property(nonatomic, strong) NSString *ID;@end光換名字不行, 我們得把換的名字和字典中的 key聯(lián)系起來(lái), 不然轉(zhuǎn)換成模型后, 屬性是沒(méi)有值得MJExtension 提供了一個(gè)+ mj_replacedKeyFromPropertyName的方法(該方法在模型中使用), 可以把原來(lái)字典中的 key 和你修改后的屬性再關(guān)聯(lián)起來(lái), 你只要告訴它, 想把什么屬性名替換為原來(lái)的那個(gè) key // person.m + (NSDictionary *)mj_replacedKeyFromPropertyName {return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description",}; }2 . 字典中又嵌套了一層字典, 示例中的 address, 同時(shí)你只需要其中的某一個(gè)屬性, 沒(méi)必要再單獨(dú)搞個(gè)模型來(lái)轉(zhuǎn), 你就可以這么做:
- 注意如果單獨(dú)搞個(gè)模型對(duì)應(yīng)這個(gè)字典, MJExtension 是會(huì)自動(dòng)將字典轉(zhuǎn)成模型的, 只有當(dāng)是字典數(shù)組時(shí)(字典數(shù)組嵌套字典數(shù)組才需要其它操作, 參考第4條)
- NSDictionary *dict = @{@"name":@"xiaofei",@"age":@24,@"id":@123456,@"description":@"haoshuai",@"address":@{@"province":@"chaohu"},};
還是在mj_replacedKeyFromPropertyName中關(guān)聯(lián), 你只需要將 key 用.連接起來(lái)就行了
- // person.m
+ (NSDictionary *)mj_replacedKeyFromPropertyName
{return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description",@"address":@"address.province"};
}
假如 address key 對(duì)應(yīng)的字典中有很多key,而且嵌套比較深, 不過(guò)你僅僅只是想要一個(gè)數(shù)據(jù), 你還是不想單獨(dú)搞個(gè)模型, 你就還是可以點(diǎn)下去, 比如說(shuō)下面更復(fù)雜的情況, 你只想取出里面狗的名字
NSDictionary *dict = @{@"name":@"xiaofei",@"age":@24,@"id":@123456,@"description":@"haoshuai",@"address":@{@"province":@"chaohu",@"school":@"sitanfu",@"family":@[@"mm", @"dd", @{@"dog":@"wangcai"}],},};+ (NSDictionary *)mj_replacedKeyFromPropertyName {return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description", // @"address":@"address.province",@"dogName":@"address.family[2].dog",}; } 3 . 可能一些變態(tài)的公司一定要讓你用駝峰命名, 但服務(wù)器返回的數(shù)據(jù)又都是該死的下劃線(xiàn), 你該怎么辦, 別怕, 叔叔教你不用在上一個(gè)方法里一個(gè)一個(gè)對(duì)應(yīng)著改...
這里要用到 + mj_replacedKeyFromPropertyName121這個(gè)方法, 121, 代表 oneToOne...MJ 說(shuō)的...
NSDictionary *dict2 = @{@"name_key":@"xiaoming",@"age_key":@20,@"info_key":@"handsome",};// person.h @property(nonatomic, strong) NSString * nameKey; @property(nonatomic, strong) NSString * infoKey; @property(nonatomic, assign) NSInteger ageKey;// person.m + (NSString *)mj_replacedKeyFromPropertyName121:(NSString *)propertyName {// propertyName 是你屬性名, 你把屬性名格式化成對(duì)應(yīng)字典中 key, 返回就可以了 NSMutableString *key = [NSMutableString string];// 遍歷propertyName的所有字符for (NSInteger i = 0; i < propertyName.length; i++) {unichar c = [propertyName characterAtIndex:i];if (c >= 'A' && c <= 'Z') { // 大寫(xiě)字母[key appendFormat:@"_%c", c + ('a' - 'A')];} else { // 非大寫(xiě)字母[key appendFormat:@"%c", c];}}return key; // 其實(shí) MJ的框架里已經(jīng)實(shí)現(xiàn)了這個(gè)方法, 你只需一句代碼:請(qǐng)跟著我心中默默念一句: 臥槽... // return [propertyName mj_underlineFromCamel]; }4 . 當(dāng)字典中又包含字典數(shù)組時(shí), 模型嵌套, 你要告訴 MJExtension 嵌套模型的類(lèi)名
NSDictionary *dict2 = @{@"name_key":@"xiaoming",@"age_key":@20,@"info_key":@"handsome",@"users": @[@{@"name":@"xx"}, @{@"name":@"yy"}, @{@"name":@"zz"}],};@property(nonatomic, strong) NSString * nameKey; @property(nonatomic, strong) NSString * infoKey; @property(nonatomic, assign) NSInteger ageKey; @property(nonatomic, strong) NSArray * users;// person.m + (NSDictionary *)mj_objectClassInArray {return @{@"users":@"User",// 或者 // @"users":[User class], }; }
還是先講在模型類(lèi)中的做法:5 . 前面都是些常規(guī)用法, 下面開(kāi)始裝逼...
所謂高級(jí)用法其實(shí)就是嚴(yán)密的邏輯加科學(xué)的管理(抽抽抽!!!)加牛逼的架構(gòu)加首席科學(xué)家的思想云云...不扯了...恩恩..
以上所有操作都是在我們的模型里面完成的, 這樣就對(duì)模型造成了一定的污染, 下次我們代碼萬(wàn)一不用 MJExtension 了, 那這些模型就都不能用了, 那就哭吧...所以大神 MJ 早就給我們做好了一切, 然后一群菜狗們屁顛屁顛拿來(lái)裝逼了, 比如本人...
以上的所有操作都可以不用再模型中操作, 我們可以拿出來(lái)放在外面, 比如某個(gè) viewController 里面統(tǒng)一設(shè)置
例子2中這么寫(xiě), 方法名差不多,只不過(guò)換成了 block 回調(diào)
// 例子 2.[Person mj_setupReplacedKeyFromPropertyName:^NSDictionary *{return @{// 模型屬性: JSON key, MJExtension 會(huì)自動(dòng)將 JSON 的 key 替換為你模型中需要的屬性@"ID":@"id",@"descrip":@"description",// @"address":@"address.province",@"dogName":@"address.family[2].dog",};}]; // 例子 3.[Person mj_setupReplacedKeyFromPropertyName121:^NSString *(NSString *propertyName) {// propertyName 是你屬性名, 你把屬性名格式化成對(duì)應(yīng)字典中 key, 返回就可以了 NSMutableString *key = [NSMutableString string];// 遍歷propertyName的所有字符for (NSInteger i = 0; i < propertyName.length; i++) {unichar c = [propertyName characterAtIndex:i];if (c >= 'A' && c <= 'Z') { // 大寫(xiě)字母[key appendFormat:@"_%c", c + ('a' - 'A')];} else { // 非大寫(xiě)字母[key appendFormat:@"%c", c];}}return key; // 其實(shí) MJ的框架里已經(jīng)實(shí)現(xiàn)了這個(gè)方法, 你只需一句代碼:請(qǐng)跟著我心中默默念一句: 臥槽... // return [propertyName mj_underlineFromCamel];}]; // 例子 4.[Person mj_setupObjectClassInArray:^NSDictionary *{return @{@"users":@"User",// 或者// @"users":[User class], };}]; 別急, 還沒(méi)完, 下面來(lái)電思想層面的雞湯...沒(méi)發(fā)現(xiàn)其實(shí)這些其實(shí)都是一次性的設(shè)置嗎, 開(kāi)發(fā)中我們這樣的配置會(huì)十分平凡, 感覺(jué)上是不是很想抽的沖動(dòng)...這一堆東西寫(xiě)在控制器里, 而且不一定只是一個(gè)控制器, 好多控制器都會(huì)有, 只要你需要轉(zhuǎn)模型...那怎么抽呢, 其實(shí)你發(fā)現(xiàn)沒(méi), 這和我們經(jīng)常會(huì)抽一個(gè)專(zhuān)門(mén)管理常量的的類(lèi)的做法, 是不是很類(lèi)似, 這里我們也是這個(gè)需求所以我們單獨(dú)抽一個(gè)專(zhuān)門(mén)配置模型的 MJExtensionConfig類(lèi)來(lái)管理這些配置, 這樣不是方便許多嗎!!!!所以我們將上面的那些配置統(tǒng)統(tǒng)拿到我們的配置類(lèi)中放到哪兒最合適, 當(dāng)然是 + load中嘍 別急, 還沒(méi)完, 下面來(lái)電思想層面的雞湯...沒(méi)發(fā)現(xiàn)其實(shí)這些其實(shí)都是一次性的設(shè)置嗎, 開(kāi)發(fā)中我們這樣的配置會(huì)十分平凡, 感覺(jué)上是不是很想抽的沖動(dòng)...這一堆東西寫(xiě)在控制器里, 而且不一定只是一個(gè)控制器, 好多控制器都會(huì)有, 只要你需要轉(zhuǎn)模型...那怎么抽呢, 其實(shí)你發(fā)現(xiàn)沒(méi), 這和我們經(jīng)常會(huì)抽一個(gè)專(zhuān)門(mén)管理常量的的類(lèi)的做法, 是不是很類(lèi)似, 這里我們也是這個(gè)需求所以我們單獨(dú)抽一個(gè)專(zhuān)門(mén)配置模型的 MJExtensionConfig類(lèi)來(lái)管理這些配置, 這樣不是方便許多嗎!!!!所以我們將上面的那些配置統(tǒng)統(tǒng)拿到我們的配置類(lèi)中放到哪兒最合適, 當(dāng)然是 + load中嘍 從如下轉(zhuǎn)載:https://www.jianshu.com/p/11a8e15f7d2b
轉(zhuǎn)載于:https://www.cnblogs.com/edensyd/p/9139025.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的序列化框架MJExtension详解 + iOS ORM框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《我们最美好的十年》丛香香喜欢谁 她的结
- 下一篇: 暗区突围手游为什么打不准