MJExtension简单介绍及使用

MJExtension是一套字典和模型之间互相转换的超轻量级框架

1、字典(JSON) --> 模型(Model)、CoreData模型(Core Data Model)
2、JSON字符串 --> 模型(Model)、CoreData模型(Core Data Model)
3、字典数组(JSON Array) --> 模型数组(Model Array)、Core Data模型数组(Core Data Model Array)
4、JSON字符串 --> 模型数组(Model Array)、Core Data模型数组(Core Data Model Array)
5、模型(Model)、CoreData模型(Core Data Model) --> 字典(JSON)
6、模型数组(Model Array)、Core Data模型数组(Core Data Model Array) --> 字典数组(JSON Array)
7、只需要一行代码,就能实现模型的所有属性进行Coding(归档和解档)

1 2 3 4 5 6是字典与模型之间的相互转换。7是模型属性的归档和解档。
1 2 3 4是JSON格式转换成模型,通常我们用于网络获取数据后,进行数据解析使用。
5 6 为模型转换成JSON格式,上传数据会用到。
7 一句话将所有的子文件全部归档反归档(MJExtension) ,所有Model都会用到,所以写在基类就好。

<code>MJCodingImplementation</code>

一、常用方法——Model中

1.1
<code>+ (void)mj_setupObjectClassInArray:(MJObjectClassInArray)objectClassInArray</code>
该方法在model中用于说明 数组属性,该属性数组中存放那种类型的model,写在init方法内部
<pre>- (instancetype)init
{
self = [super init];
if (self) {
// ZYXStatusResult类中的两个数组中存放的是哪两个模型
[ZYXStatusResult mj_setupObjectClassInArray:^NSDictionary *{
return @{
@"statuses" : @"ZYXStatus", // @"statuses" : [ZYXStatus class],
@"ads" : @"ZYXAd" // @"ads" : [ZYXAd class]
};
}];
}
return self;
}</pre>
1.2

      <code>+ (void)mj_setupReplacedKeyFromPropertyName:(MJReplacedKeyFromPropertyName)replacedKeyFromPropertyName</code>

该方法在model中用于处理属性名和JSON中key值不同的情况,将属性名和key进行对应并替换。写在init方法内部
<pre>

  • (instancetype)init
    {
    self = [super init];
    if (self) {
    [ZYXStudent mj_setupReplacedKeyFromPropertyName:^NSDictionary *{
    return @{
    @"ID" : @"id",
    @"desc" : @"desciption",
    @"oldName" : @"name.oldName",
    @"nowName" : @"name.newName",
    @"info":@"name.info",
    @"nameChangedTime" : @"name.info[1].nameChangedTime",
    @"bag" : @"other.bag"
    };
    }];
    }
    return self;
    }</pre>

二、常用方法——将JSON格式转Model

2.1
<code>+ (instancetype)mj_objectWithKeyValues:(id)keyValues</code>
字典转模型,复合字典转模型,嵌套(数组)字典转模型 JSON字符串转模型都会用到这个方法。以下仅仅是一个事例,本Demo可以通过文字末尾链接查看。
<pre>
// 3、多层字典嵌套转成嵌套模型
-(void)DictionaryTransferToMultiModel{
NSDictionary *dict = @{
@"text" : @"是啊,今天天气确实不错!",
@"user" : @{
@"name" : @"Jack",
@"icon" : @"lufy.png"
},
@"retweetedStatus" : @{
@"text" : @"今天天气真不错!",
@"user" : @{
@"name" : @"Rose",
@"icon" : @"nami.png"
}
}
};
// 将字典转为Status模型
ZYXStatus *status = [ZYXStatus mj_objectWithKeyValues:dict];
NSLog(@"text=%@, name=%@, icon=%@", status.text, status.user.name, status.user.icon);
// text=是啊,今天天气确实不错!, name=Jack, icon=lufy.png

// NSLog(@"text2=%@, name2=%@, icon2=%@", status.retweetedStatus.text, status.retweetedStatus.user.name, status.retweetedStatus.user.icon);
// text2=今天天气真不错!, name2=Rose, icon2=nami.png
}</pre>
2.2
<code>+ (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray</code>
JSON数组转成模型数组。这个也是非常常用的。
<pre>
-(void)JSONarrayTransferToModelarray{
NSArray *dictArray = @[
@{
@"name" : @"Jack",
@"icon" : @"lufy.png"
},
@{
@"name" : @"Rose",
@"icon" : @"nami.png"
}
];

// JSON array -> User array
NSArray *userArray = [ZYXUser mj_objectArrayWithKeyValuesArray:dictArray];

// Printing
for (ZYXUser *user in userArray) {
    NSLog(@"name=%@, icon=%@", user.name, user.icon);
}
// name=Jack, icon=lufy.png
// name=Rose, icon=nami.png
ZYXUser *user = userArray[0];
NSLog(@"user.name=%@",user.name);
// user.name=Jack

}
</pre>

三、常用方法——将Model转JSON

3.1
<code>- (NSMutableDictionary *)mj_keyValues</code>
<pre>
-(void)ModelTransferToJSONDictionary{
ZYXUser *user = [[ZYXUser alloc] init];
user.name = @"Jack";
user.icon = @"lufy.png";

ZYXStatus *status = [[ZYXStatus alloc] init];
status.user = user;
status.text = @"Nice mood!";

// Status -> JSON
NSDictionary *statusDict = status.mj_keyValues;
NSLog(@"%@", statusDict);

/*
 2017-02-09 10:50:03.372 MJExtensionDemo[866:219284] {
    text = "Nice mood!";
    user =     {
         age = 0;
         gay = 0;
         icon = "lufy.png";
         name = Jack;
         sex = 0;
    };
 }

 */

// More complex situation
ZYXStudent *stu = [[ZYXStudent alloc] init];
stu.ID = @"123";
stu.oldName = @"rose";
stu.nowName = @"jack";
stu.desc = @"handsome";
stu.nameChangedTime = @"2018-09-08";

ZYXBag *bag = [[ZYXBag 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;
 }
 */

}
</pre>

3.2
<code>+ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray</code>
<pre> // 1.新建模型数组
MJUser *user1 = [[MJUser alloc] init];
user1.name = @"Jack";
user1.icon = @"lufy.png";

MJUser *user2 = [[MJUser alloc] init];
user2.name = @"Rose";
user2.icon = @"nami.png";

NSArray *userArray = @[user1, user2];

// 2.将模型数组转为字典数组
NSArray *dictArray = [MJUser mj_keyValuesArrayWithObjectArray:userArray];
MJExtensionLog(@"%@", dictArray);

</pre>

简单使用小Demo:
https://github.com/zhangyanxiao/MJExtensionDemo
MJ:
https://github.com/CoderMJLee/MJExtension

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 免责声明:写这篇笔记纯属是方便自己以及能使用到的小伙伴们作为参考,方便查找。无任何利益关系。本文参考使用说明地址链...
    coderJerry01阅读 3,395评论 0 4
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • 世界上转换速度最快、使用最简单方便的字典转模型框架 能做什么? MJExtension是一套字典和模型之间互相转换...
    今年27阅读 757评论 0 1
  • 此前蒋方舟有一篇文是说,马拉松像是中产阶级的广场舞,很多网友不苟同。单这一个标题里就有着阶级的意味,就有了对运动方...
    小树莓汁阅读 399评论 0 0
  • “妈妈,你怎么还不下班?”加班中的我,接到了小家伙的电话。最近,只要超过六点半没回家,他都会给我打电话。 “妈妈,...
    向着太阳奔跑的石头阅读 134评论 0 0