MJExtension使用指導(dǎo)(轉(zhuǎn))

MJExtension能做什么湃密?

MJExtension是一套字典和模型之間互相轉(zhuǎn)換的超輕量級框架

MJExtension能完成的功能

字典(JSON) --> 模型(Model)

模型(Model) --> 字典(JSON)

字典數(shù)組(JSON Array) --> 模型數(shù)組(Model Array)

模型數(shù)組(Model Array) --> 字典數(shù)組(JSON Array)

詳盡用法主要參考 main.m中的各個函數(shù) 以及 NSObject+MJKeyValue.h

MJExtension和JSONModel拾弃、Mantle等框架的區(qū)別

1. 轉(zhuǎn)換速率:

最近一次測試表明:MJExtension > JSONModel > Mantle

各位開發(fā)者也可以自行測試

2.具體用法:

JSONModel

要求所有模型類必須繼承自JSONModel基類

Mantle

要求所有模型類必須繼承自MTModel基類

MJExtension

不需要你的模型類繼承任何特殊基類焙畔,毫無污染县遣,毫無侵入性

如何使用MJExtension

方法一:cocoapods導(dǎo)入pod 'MJExtension'

方法二:手動導(dǎo)入

將MJExtensionExample/MJExtensionExample/MJExtension文件夾中的所有源代碼拽入項目中

導(dǎo)入主頭文件:#import "MJExtension.h"

MJExtension.h

MJConst.h

MJConst.m

MJFoundation.h

MJFoundation.m

MJIvar.h

MJIvar.m

MJType.h

MJType.m

NSObject+MJCoding.h

NSObject+MJCoding.m

NSObject+MJIvar.h

NSObject+MJIvar.m

NSObject+MJKeyValue.h

NSObject+MJKeyValue.m

1.最簡單的字典轉(zhuǎn)模型

typedef enum {

SexMale,

SexFemale} Sex;

@interface User : NSObject

@property (copy, nonatomic) NSString *name;

@property (copy, nonatomic) NSString *icon;

@property (assign, nonatomic) int age;

@property (assign, nonatomic) double height;

@property (strong, nonatomic) NSNumber *money;

@property (assign, nonatomic) Sex sex;

@end

NSDictionary *dict = @{

@"name" : @"Jack",

@"icon" : @"lufy.png",

@"age" : @20,

@"height" : @"1.55",

@"money" : @100.9,

@"sex" : @(SexFemale)

};

// 將字典轉(zhuǎn)為User模型

User *user = [User objectWithKeyValues:dict];

NSLog(@"name=%@, icon=%@, age=%d, height=%@, money=%@, sex=%d", user.name, user.icon, user.age, user.height, user.money, user.sex);

// name=Jack, icon=lufy.png, age=20, height=1.550000, money=100.9, sex=1

核心代碼1:

[User objectWithKeyValues:dict]

2.模型中嵌套模型

@interface Status : NSObject

/** 微博文本內(nèi)容 */

@property (copy, nonatomic) NSString *text;

/** 微博作者 */

@property (strong, nonatomic) User *user;

/** 轉(zhuǎn)發(fā)的微博 */

@property (strong, nonatomic) Status *retweetedStatus;

@end

NSDictionary *dict = @{

@"text" : @"是啊虱咧,今天天氣確實不錯!",

@"user" : @{

@"name" : @"Jack",

@"icon" : @"lufy.png"

},

@"retweetedStatus" : @{

@"text" : @"今天天氣真不錯种樱!",

@"user" : @{

@"name" : @"Rose",

@"icon" : @"nami.png"

}

}

};

// 將字典轉(zhuǎn)為Status模型

Status *status = [Status objectWithKeyValues:dict];

NSString *text = status.text;

NSString *name = status.user.name;

NSString *icon = status.user.icon;

NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);

// text=是啊蒙袍,今天天氣確實不錯!, name=Jack, icon=lufy.png

NSString *text2 = status.retweetedStatus.text;

NSString *name2 = status.retweetedStatus.user.name;

NSString *icon2 = status.retweetedStatus.user.icon;

NSLog(@"text2=%@, name2=%@, icon2=%@", text2, name2, icon2);

// text2=今天天氣真不錯嫩挤!, name2=Rose, icon2=nami.png

核心代碼2

[Status objectWithKeyValues:dict]

3.模型中有個數(shù)組屬性害幅,數(shù)組里面又要裝著其它模型

@interface Ad : NSObject

@property (copy, nonatomic) NSString *image;

@property (copy, nonatomic) NSString *url;

@end

@interface StatusResult : NSObject

/** 存放著一堆的微博數(shù)據(jù)(里面都是Status模型) */

@property (strong, nonatomic) NSMutableArray *statuses;

/** 存放著一堆的廣告數(shù)據(jù)(里面都是Ad模型) */

@property (strong, nonatomic) NSArray *ads;

@property (strong, nonatomic) NSNumber *totalNumber;

@end

@implementation StatusResult

// 實現(xiàn)這個方法的目的:告訴MJExtension框架statuses和ads數(shù)組里面裝的是什么模型

/*? ? + (NSDictionary *)objectClassInArray{

return @{

@"statuses" : [Status class],

@"ads" : [Ad class]? ? };

}

+ (Class)objectClassInArray:(NSString *)propertyName{

if ([propertyName isEqualToString:@"statuses"]) {

return [Status class];

} else if ([propertyName isEqualToString:@"ads"]) {

return [Ad class];? ? }

return nil;}

*/

// 這個方法對比上面的2個方法更加沒有侵入性和污染,因為不需要導(dǎo)入Status和Ad的頭文件

+ (NSDictionary *)objectClassInArray{

return @{

@"statuses" : @"Status",

@"ads" : @"Ad"

};

}

@end

NSDictionary *dict = @{

@"statuses" : @[

@{

@"text" : @"今天天氣真不錯岂昭!",

@"user" : @{

@"name" : @"Rose",

@"icon" : @"nami.png"

}

},

@{

@"text" : @"明天去旅游了",

@"user" : @{

@"name" : @"Jack",

@"icon" : @"lufy.png"

}

}

],

@"ads" :@[

@{

@"image" : @"ad01.png",

@"url" : @"http://www.ad01.com"

},

@{

@"image" : @"ad02.png",

@"url" : @"http://www.ad02.com"

}

],

@"totalNumber" : @"2014"

};

// 將字典轉(zhuǎn)為StatusResult模型

StatusResult *result = [StatusResult objectWithKeyValues:dict];

NSLog(@"totalNumber=%@", result.totalNumber);

// totalNumber=2014

// 打印statuses數(shù)組中的模型屬性

for (Status *status in result.statuses) {

NSString *text = status.text;

NSString *name = status.user.name;? ? NSString *icon = status.user.icon;

NSLog(@"text=%@, name=%@, icon=%@", text, name, icon);}

// text=今天天氣真不錯以现!, name=Rose, icon=nami.png

// text=明天去旅游了, name=Jack, icon=lufy.png

// 打印ads數(shù)組中的模型屬性

for (Ad *ad in result.ads) {

NSLog(@"image=%@, url=%@", ad.image, ad.url);}

// image=ad01.png, url=http://www.ad01.com

// image=ad02.png, url=http://www.ad02.com

核心代碼3:

在模型內(nèi)部實現(xiàn)+ (NSDictionary *)objectClassInArray方法

[StatusResult objectWithKeyValues:dict]

4.模型中的屬性名和字典中的key不相同(或者需要多級映射)

@interface Bag : NSObject

@property (copy, nonatomic) NSString *name;

@property (assign, nonatomic) double price;@end@interface Student : NSObject

@property (copy, nonatomic) NSString *ID;

@property (copy, nonatomic) NSString *desc;

@property (copy, nonatomic) NSString *nowName;

@property (copy, nonatomic) NSString *oldName;

@property (copy, nonatomic) NSString *nameChangedTime;

@property (strong, nonatomic) Bag *bag;

@end

@implementation Student

// 實現(xiàn)這個方法的目的:告訴MJExtension框架模型中的屬性名對應(yīng)著字典的哪個key

+ (NSDictionary *)replacedKeyFromPropertyName{

return @{

@"ID" : @"id",

@"desc" : @"desciption",

@"oldName" : @"name.oldName",

@"nowName" : @"name.newName",

@"nameChangedTime" : @"name.info.nameChangedTime",

@"bag" : @"other.bag"

};

}

@end

NSDictionary *dict = @{

@"id" : @"20",

@"desciption" : @"孩子",

@"name" : @{

@"newName" : @"lufy",

@"oldName" : @"kitty",

@"info" : @{

@"nameChangedTime" : @"2013-08"

}

},

@"other" : @{

@"bag" : @{

@"name" : @"小書包",

@"price" : @100.7

}

}

};

// 將字典轉(zhuǎn)為Student模型

Student *stu = [Student objectWithKeyValues:dict];

// 打印Student模型的屬性

NSLog(@"ID=%@, desc=%@, oldName=%@, nowName=%@, nameChangedTime=%@", stu.ID, stu.desc, stu.oldName, stu.nowName, stu.nameChangedTime);

// ID=20, desc=孩子, oldName=kitty, nowName=lufy, nameChangedTime=2013-08

NSLog(@"bagName=%@, bagPrice=%f", stu.bag.name, stu.bag.price);

// bagName=小書包, bagPrice=100.700000

核心代碼4:

在模型內(nèi)部實現(xiàn)+ (NSDictionary *)replacedKeyFromPropertyName方法

[Student objectWithKeyValues:dict]

5.將一個字典數(shù)組轉(zhuǎn)成模型數(shù)組

NSArray *dictArray = @[

@{

@"name" : @"Jack",

@"icon" : @"lufy.png",

},

@{

@"name" : @"Rose",

@"icon" : @"nami.png",

}

];

// 將字典數(shù)組轉(zhuǎn)為User模型數(shù)組

NSArray *userArray = [User objectArrayWithKeyValuesArray:dictArray];

// 打印userArray數(shù)組中的User模型屬性

for (User *user in userArray) {

NSLog(@"name=%@, icon=%@", user.name, user.icon);}

// name=Jack, icon=lufy.png

// name=Rose, icon=nami.png

核心代碼5:

[User objectArrayWithKeyValuesArray:dictArray]

6.將一個模型轉(zhuǎn)成字典

// 新建模型

User *user = [[User alloc] init];

user.name = @"Jack";

user.icon = @"lufy.png";

Status *status = [[Status alloc] init];

status.user = user;

status.text = @"今天的心情不錯!";

// 將模型轉(zhuǎn)為字典

NSDictionary *statusDict = status.keyValues;

NSLog(@"%@", statusDict);

/*{ text = "今天的心情不錯!";

user = {

icon = "lufy.png";

name = Jack;

};

}*/

// 多級映射的模型

Student *stu = [[Student alloc] init];

stu.ID = @"123";

stu.oldName = @"rose";

stu.nowName = @"jack";

stu.desc = @"handsome";

stu.nameChangedTime = @"2018-09-08";

Bag *bag = [[Bag alloc] init];

bag.name = @"小書包";

bag.price = 205;

stu.bag = bag;

NSDictionary *stuDict = stu.keyValues;NSLog(@"%@", stuDict);

/*

{? ? desciption = handsome;

id = 123;

name = {

info ={

nameChangedTime = "2018-09-08";

};

newName = jack;

oldName = rose;

};

other = {

bag ={

name = "小書包";

price = 205;

};

};

}

*/

核心代碼6:

status.keyValues邑遏、stu.keyValues

7.將一個模型數(shù)組轉(zhuǎn)成字典數(shù)組

// 新建模型數(shù)組

User *user1 = [[User alloc] init];

user1.name = @"Jack";

user1.icon = @"lufy.png";

User *user2 = [[User alloc] init];

user2.name = @"Rose";

user2.icon = @"nami.png";

NSArray *userArray = @[user1, user2];

// 將模型數(shù)組轉(zhuǎn)為字典數(shù)組

NSArray *dictArray = [User keyValuesArrayWithObjectArray:userArray];

NSLog(@"%@", dictArray);

/*(

{? ? ? ? icon = "lufy.png";? ? ? ? name = Jack;? ? },

{? ? ? ? icon = "nami.png";? ? ? ? name = Rose;? ? }? )*/

核心代碼7:

[User keyValuesArrayWithObjectArray:userArray]

更多用法

參考NSObject+MJKeyValue.h

參考NSObject+MJCoding.h

作者:PPAbner

鏈接:http://www.reibang.com/p/93c242452b9b

來源:簡書

著作權(quán)歸作者所有佣赖。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處无宿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茵汰,一起剝皮案震驚了整個濱河市枢里,隨后出現(xiàn)的幾起案子孽鸡,更是在濱河造成了極大的恐慌,老刑警劉巖栏豺,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件彬碱,死亡現(xiàn)場離奇詭異,居然都是意外死亡奥洼,警方通過查閱死者的電腦和手機(jī)巷疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灵奖,“玉大人嚼沿,你說我怎么就攤上這事〈苫迹” “怎么了骡尽?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長擅编。 經(jīng)常有香客問我攀细,道長,這世上最難降的妖魔是什么爱态? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任谭贪,我火速辦了婚禮,結(jié)果婚禮上锦担,老公的妹妹穿的比我還像新娘俭识。我一直安慰自己,他們只是感情好洞渔,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布套媚。 她就那樣靜靜地躺著,像睡著了一般痘煤。 火紅的嫁衣襯著肌膚如雪凑阶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天衷快,我揣著相機(jī)與錄音宙橱,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛师郑,可吹牛的內(nèi)容都是我干的环葵。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼宝冕,長吁一口氣:“原來是場噩夢啊……” “哼张遭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起地梨,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤菊卷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宝剖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洁闰,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年万细,在試婚紗的時候發(fā)現(xiàn)自己被綠了扑眉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡赖钞,死狀恐怖腰素,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雪营,我是刑警寧澤弓千,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站卓缰,受9級特大地震影響计呈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜征唬,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一捌显、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧总寒,春花似錦扶歪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至年枕,卻和暖如春炫欺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熏兄。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工品洛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留树姨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓桥状,卻偏偏與公主長得像帽揪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辅斟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容