学习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阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 转发自:MFExtension使用 一、MJExtension第三方框架 我们在iOS开发过程中,我们常常需要将字...
    碧玉小瑕阅读 1,457评论 1 2
  • 世界上转换速度最快、使用最简单方便的字典转模型框架 能做什么? MJExtension是一套字典和模型之间互相转换...
    今年27阅读 781评论 0 1
  • 免责声明:写这篇笔记纯属是方便自己以及能使用到的小伙伴们作为参考,方便查找。无任何利益关系。本文参考使用说明地址链...
    coderJerry01阅读 3,438评论 0 4
  • 前言: MJExtension是iOS的字典装模型的一个第三方框架。相对于JSONKit和SBJson相比MJEx...
    hello_小磊阅读 5,992评论 0 2
  • MJExtension能做什么? MJExtension是一套字典和模型之间互相转换的超轻量级框架 MJExten...
    数据大鱼阅读 988评论 0 0