學習MJExtension方法的使用

此心安處 便是吾鄉

前言

之前一直用的是YYmodel比較多,對于MJExtension里面的方法不熟悉,記錄學習下

1.JSON -> Model【字典轉模型】

@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (assign, nonatomic) int age;
@property (strong, nonatomic) NSNumber *money;
@end

NSDictionary *dict = @{? @"name" : @"Jack",? ? @"age" : @20,? ? ?@"money" : @100.9? };
// JSON -> User
?User *user = [User mj_objectWithKeyValues:dict];
?NSLog(@"name=%@, age=%zd, money=%@, ", user.name, user.age, user.money);
?//輸出: name=Jack, age=20,? money=100.9

2.JSONString -> Model【JSON字符串轉模型】

?// 1.定義個jsonString??
NSString *jsonString = @"{\"name\":\"Tom\", \"age\":20}";? ?
// 2.JSONString -> Model? ?
User *user = [User mj_objectWithKeyValues:jsonString];? ?
// 3.打印? ?
NSLog(@"name=%@, age=%d", user.name, user.age);? ?
// 輸出:name=Tom,age=20

源碼針對mj_objectWithKeyValues方法的注釋解析?
keyValues 字典(可以是NSDictionary、NSData、NSString)如果是嵌套的類型也是用改方法,嵌套的模型也是字典(如果模型中包含數組需要額外處理下面在講解)

#pragma mark - 字典轉模型
/**
?*? 通過字典來創建一個模型
?*? @param keyValues 字典(可以是NSDictionary、NSData、NSString)?
?*? @return 新建的對象?
?*/+ (instancetype)mj_objectWithKeyValues:(id)keyValues;

如果是多層嵌套的數據結構比如下面最外層是個字典,字典里面嵌套字典以及包含數組數據結構如下圖

定義的json數據可以自己驗證
NSString *jsonStr =? {"message":"dd","userInfo":{"name":"哈哈大笑","avatar":"http:baidu.com","likePerson":[{"avatar":"http:baidu.com","userId":1},{"avatar":"http:baidu.com","userId":2}],"bannerData":[{"avatar":"http:baidu.com","userId":3},{"avatar":"http:baidu.com","userId":2}]},"successful":true};

//在.h文件聲明的Model屬性
@interface BannerData :NSObject
@property (nonatomic ,copy) NSString *avatar;
@property (nonatomic ,assign) NSInteger userId;
@end

@interface LikePerson :NSObject
@property (nonatomic ,copy) NSString *avatar;
@property (nonatomic ,assign) NSInteger userId;
@end

@interface UserInfo :NSObject
@property (nonatomic ,copy) NSArray<BannerData *> *bannerData;
@property (nonatomic ,copy) NSArray<LikePerson *> *likePerson;
@property (nonatomic ,copy) NSString *name;
@property (nonatomic ,copy) NSString *avatar;
@end

@interface MianModel :NSObject
@property (nonatomic ,copy) NSString *message;
@property (nonatomic ,strong) UserInfo *userInfo;
@property (nonatomic ,assign) BOOL successful;
@end

//.m 里面的寫法
@implementation BannerData
@end

@implementation LikePerson
@end

@implementation UserInfo
//mj 解析?
+ (NSDictionary *)mj_objectClassInArray {? ?
return @{
@"bannerData":[BannerData class],@"likePerson":[LikePerson class]};
//@"bannerData":@"BannerData",@"likePerson":@"LikePerson"};一樣的意思
}
@end

@implementation MianModel
@end

/**
*方法:+ (NSDictionary *)mj_objectClassInArray;數組中需要轉換的模型類,
@return 字典中的key是數組屬性名,value是數組中存放模型的Class(Class類型或者NSString類型)
*/

//實現方法,最外層如果是字典,只需要一一對應就好,轉為model的方法是一樣的,如果最外層是數組結構,那就需要第3個方式了
MianModel *mainModel = [MianModel mj_objectWithKeyValues:jsonStr];? ?

3.JSON array -> model array【將一個字典數組轉成模型數組】

NSArray *dictArray = @[ @{ @"name" : @"Jack", @"icon" : @"lufy.png" }, @{ @"name" : @"Rose", @"icon" : @"nami.png" } ];
// JSON array -> User array
NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];
// 打印
for (User *user in userArray) {
NSLog(@"name=%@, icon=%@", user.name, user.icon);
}
// name=Jack, icon=lufy.png // name=Rose, icon=nami.png
//注意如果這個數組的鍵對應的還有個是數組對象,那么在聲明的.m 里面在對應的上一層的對象里面也要寫mj_objectClassInArray這個方法,方法里面寫的內容,可以參考第三個的操作

#pragma mark - 字典數組轉模型數組
/**?
*? 通過字典數組來創建一個模型數組?
*? @param keyValuesArray 字典數組(可以是NSDictionary、NSData、NSString)?
*? @return 模型數組?
*/
+ (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(id)keyValuesArray;

4.Model -> JSON【將一個模型轉成字典】

//New model
User *user = [[User alloc] init];
user.name =@"Jack";
user.icon =@"lufy.png";
Status *status = [[Status alloc] init];
status.user = user;
status.text = @"Nice mood!";
//Status -> JSON
NSDictionary*statusDict = status.mj_keyValues;
NSLog(@"%@", statusDict);
/* { text = "Nice mood!"; user = { icon = "lufy.png"; name = Jack; }; }*/
//More complex situation
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 =@"a red bag";
bag.price = 205;
stu.bag = bag;
NSDictionary *stuDict = stu.mj_keyValues;
NSLog(@"%@", stuDict);
/*{ ID = 123; bag = { name = "\U5c0f\U4e66\U5305"; price = 205; }; desc = handsome; nameChangedTime = "2018-09-08"; nowName = jack; oldName = rose;}*/

5.Model array -> JSON array【將一個模型數組轉成字典數組】

userArray:這是個模型數組
NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray];
/**?
*? 通過模型數組來創建一個字典數組?
*?@param objectArray 模型數組?
*? @return 字典數組?
*/

總結:

常用的一些方法都是這么多了吧,接下來把方法的的意思整理在一塊方面后面查閱,
【更多用法】查看NSObject+MJKeyValue.h NSObject+MJCoding.h文件
MJCoding里面的用法后面再研究研究

// 字典轉模型?mj_objectWithKeyValues
?User *user = [User mj_objectWithKeyValues:dict];
//數組轉模型?mj_objectArrayWithKeyValuesArray
NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];
//模型轉字典?mj_keyValues
NSDictionary *stuDict = stuModel.mj_keyValues;
//模型數組轉數組?mj_keyValuesArrayWithObjectArray
NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray];
// 轉為JSON Data
- (NSData *)mj_JSONData;
//轉為字典或者數組
- (id)mj_JSONObject; //?NSDictionary *giftDic = [jsonString mj_JSONObject];
//轉為JSON 字符串
- (NSString *)mj_JSONString;/ /NSString *jsonStr = [dictArray mj_JSONString];

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370

推薦閱讀更多精彩內容

  • 轉發自:MFExtension使用 一、MJExtension第三方框架 我們在iOS開發過程中,我們常常需要將字...
    碧玉小瑕閱讀 1,472評論 1 2
  • 世界上轉換速度最快、使用最簡單方便的字典轉模型框架 能做什么? MJExtension是一套字典和模型之間互相轉換...
    今年27閱讀 795評論 0 1
  • 免責聲明:寫這篇筆記純屬是方便自己以及能使用到的小伙伴們作為參考,方便查找。無任何利益關系。本文參考使用說明地址鏈...
    coderJerry01閱讀 3,460評論 0 4
  • 前言: MJExtension是iOS的字典裝模型的一個第三方框架。相對于JSONKit和SBJson相比MJEx...
    hello_小磊閱讀 6,028評論 0 2
  • MJExtension能做什么? MJExtension是一套字典和模型之間互相轉換的超輕量級框架 MJExten...
    數據大魚閱讀 993評論 0 0