MJExtension<轉(zhuǎn)>

世界上轉(zhuǎn)換速度最快、使用最簡(jiǎn)單方便的字典轉(zhuǎn)模型框架

能做什么挂据?

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

MJExtension能完成的功能

字典(JSON) --> 模型(Model)运提、CoreData模型(Core Data Model)

JSON字符串 --> 模型(Model)术徊、CoreData模型(Core Data Model)

模型(Model)盖腕、CoreData模型(Core Data Model) --> 字典(JSON)

字典數(shù)組(JSON Array) --> 模型數(shù)組(Model Array)钝域、Core Data模型數(shù)組(Core Data Model Array)

JSON字符串 --> 模型數(shù)組(Model Array)妨退、Core Data模型數(shù)組(Core Data Model Array)

模型數(shù)組(Model Array)妇萄、Core Data模型數(shù)組(Core Data Model Array) --> 字典數(shù)組(JSON Array)

只需要一行代碼蜕企,就能實(shí)現(xiàn)模型的所有屬性進(jìn)行Coding(歸檔和解檔)

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

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

轉(zhuǎn)換速率:

最近一次測(cè)試表明:MJExtension > JSONModel > Mantle

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

具體用法:

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

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

MJExtension:不需要你的模型類繼承任何特殊基類冠句,也不需要修改任何模型代碼轻掩,毫無污染,毫無侵入性

如何使用MJExtension

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

手動(dòng)導(dǎo)入:

將MJExtensionExample/MJExtensionExample/MJExtension文件夾中的所有源代碼拽入項(xiàng)目中

導(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

最簡(jiǎn)單的字典轉(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

核心代碼

[User objectWithKeyValues:dict]

JSON字符串轉(zhuǎn)模型

// 1.定義一個(gè)JSON字符串

NSString *jsonString = @"{\"name\":\"Jack\", \"icon\":\"lufy.png\", \"age\":20}";

// 2.將JSON字符串轉(zhuǎn)為User模型

User *user = [User objectWithKeyValues:jsonString];

// 3.打印User模型的屬性

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

// name=Jack, icon=lufy.png, age=20

核心代碼

[User objectWithKeyValues:dict]

模型中嵌套模型

@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" : @"是啊懦底,今天天氣確實(shí)不錯(cuò)唇牧!",

@"user" : @{

@"name" : @"Jack",

@"icon" : @"lufy.png"

},

@"retweetedStatus" : @{

@"text" : @"今天天氣真不錯(cuò)!",

@"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=是啊聚唐,今天天氣確實(shí)不錯(cuò)丐重!, 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=今天天氣真不錯(cuò)!, name2=Rose, icon2=nami.png

核心代碼

[Status objectWithKeyValues:dict]

模型中有個(gè)數(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

/***********************************************/

// StatusResult類中的statuses數(shù)組中存放的是Status模型

// StatusResult類中的ads數(shù)組中存放的是Ad模型

[StatusResult setupObjectClassInArray:^NSDictionary *{

return @{

@"statuses" : @"Status",

@"ads" : @"Ad"

};

}];

// 相當(dāng)于在StatusResult.m中實(shí)現(xiàn)了+objectClassInArray方法

NSDictionary *dict = @{

@"statuses" : @[

@{

@"text" : @"今天天氣真不錯(cuò)弥臼!",

@"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=今天天氣真不錯(cuò)!, 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

核心代碼

調(diào)用+ (void)setupObjectClassInArray:方法

[StatusResult objectWithKeyValues:dict]

提醒一句:如果NSArray\NSMutableArray屬性中存放的不希望是模型根灯,而是NSNumber径缅、NSString等基本數(shù)據(jù),那么就不需要調(diào)用+ (void)setupObjectClassInArray:方法

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

@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

/***********************************************/

// Student中的ID屬性對(duì)應(yīng)著字典中的id

// ....

[Student setupReplacedKeyFromPropertyName:^NSDictionary *{

return @{@"ID" : @"id",

@"desc" : @"desciption",

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

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

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

@"bag" : @"other.bag"

};

}];

// 相當(dāng)于在Student.m中實(shí)現(xiàn)了+replacedKeyFromPropertyName方法

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

核心代碼

調(diào)用+ (void)setupReplacedKeyFromPropertyName:方法

[Student objectWithKeyValues:dict]

將一個(gè)字典數(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

核心代碼

[User objectArrayWithKeyValuesArray:dictArray]

將一個(gè)模型轉(zhuǎn)成字典

// 新建模型

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

user.name = @"Jack";

user.icon = @"lufy.png";

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

status.user = user;

status.text = @"今天的心情不錯(cuò)烙肺!";

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

NSDictionary *statusDict = status.keyValues;

NSLog(@"%@", statusDict);

/*

{

text = "今天的心情不錯(cuò)纳猪!";

user =? ? {

icon = "lufy.png";

name = Jack;

};

}

*/

// 多級(jí)映射的模型

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;

};

};

}

*/

核心代碼

status.keyValues、stu.keyValues

將一個(gè)模型數(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;

}

)

*/

核心代碼

[User keyValuesArrayWithObjectArray:userArray]

Core Data

NSDictionary *dict = @{

@"name" : @"Jack",

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

@"age" : @20,

@"height" : @1.55,

@"money" : @"100.9",

@"sex" : @(SexFemale),

@"gay" : @"true"

};

// 這個(gè)Demo僅僅提供思路桃笙,具體的方法參數(shù)需要自己創(chuàng)建

NSManagedObjectContext *context = nil;

User *user = [User objectWithKeyValues:dict context:context];

// 利用CoreData保存模型

[context save:nil];

Core code

[User objectWithKeyValues:dict context:context]

Coding

#import "MJExtension.h"

@implementation User

// NSCoding實(shí)現(xiàn)

MJCodingImplementation

@end

/***********************************************/

// Bag類中的name屬性不參與歸檔

[Bag setupIgnoredCodingPropertyNames:^NSArray *{

return @[@"name"];

}];

// 相當(dāng)于在Bag.m中實(shí)現(xiàn)了+ignoredCodingPropertyNames方法

// 創(chuàng)建模型

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

bag.name = @"Red bag";

bag.price = 200.8;

NSString *file = [NSHomeDirectory() stringByAppendingPathComponent:@"Desktop/bag.data"];

// 歸檔

[NSKeyedArchiver archiveRootObject:bag toFile:file];

// 解檔

Bag *decodedBag = [NSKeyedUnarchiver unarchiveObjectWithFile:file];

NSLog(@"name=%@, price=%f", decodedBag.name, decodedBag.price);

// name=(null), price=200.800000

Core code

MJCodingImplementation

調(diào)用+ (void)setupIgnoredCodingPropertyNames方法(如果全部屬性都要?dú)w檔氏堤、解檔,那就不需要調(diào)用這個(gè)方法)

更多用法

參考NSObject+MJKeyValue.h

參考NSObject+MJCoding.h

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搏明,一起剝皮案震驚了整個(gè)濱河市鼠锈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌星著,老刑警劉巖购笆,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異虚循,居然都是意外死亡同欠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門横缔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铺遂,“玉大人,你說我怎么就攤上這事茎刚〗笕瘢” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵膛锭,是天一觀的道長(zhǎng)粮坞。 經(jīng)常有香客問我笛质,道長(zhǎng),這世上最難降的妖魔是什么捞蚂? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮跷究,結(jié)果婚禮上姓迅,老公的妹妹穿的比我還像新娘。我一直安慰自己俊马,他們只是感情好丁存,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柴我,像睡著了一般解寝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艘儒,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天聋伦,我揣著相機(jī)與錄音,去河邊找鬼界睁。 笑死觉增,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翻斟。 我是一名探鬼主播逾礁,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼访惜!你這毒婦竟也來了嘹履?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤债热,失蹤者是張志新(化名)和其女友劉穎砾嫉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳柔,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焰枢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舌剂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片济锄。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖霍转,靈堂內(nèi)的尸體忽然破棺而出荐绝,到底是詐尸還是另有隱情,我是刑警寧澤避消,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布低滩,位于F島的核電站召夹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏恕沫。R本人自食惡果不足惜监憎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婶溯。 院中可真熱鬧鲸阔,春花似錦、人聲如沸迄委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叙身。三九已至渔扎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間信轿,已是汗流浹背晃痴。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留财忽,地道東北人愧旦。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像定罢,于是被迫代替她去往敵國和親笤虫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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