MJExtension简介及使用

一, 简介

1.MJExtension是一套字典和模型之间互相转换的超轻量级框架,支持以下类型转换:

  • JSON –> Model、Core Data Model
  • JSONString –> Model、Core Data Model
  • Model、Core Data Model –> JSON
  • JSON Array –> Model Array、Core Data Model Array
  • JSONString –> Model Array、Core Data Model Array
  • Model Array、Core Data Model Array –> JSON Array
  • Coding all properties of model in one line code.

二, 如何使用

cocoapods导入:pod 'MJExtension'

三,常用 API 说明

示例中相关类.h

typedef enum {
SexMale,
SexFemale
} Sex;
@interface User : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *icon;
@property (assign, nonatomic) unsigned int age;
@property (copy, nonatomic) NSString *height;
@property (strong, nonatomic) NSNumber *money;
@property (assign, nonatomic) Sex sex;
@property (assign, nonatomic, getter=isGay) BOOL gay;
@end
@interface Status : NSObject
@property (copy, nonatomic) NSString *text;
@property (strong, nonatomic) User *user;
@end

@interface Ad : NSObject
@property (copy, nonatomic) NSString *image;
@property (copy, nonatomic) NSString *url;
@end
@interface StatusResult : NSObject
/** Contatins Status model */
@property (strong, nonatomic) NSMutableArray *statuses;
/** Contatins Ad model */
@property (strong, nonatomic) NSArray *ads;
@property (strong, nonatomic) NSNumber *totalNumber;
@end
@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
1.字典转模型.
  NSDictionary *dict = @{
                       @"name" : @"Jack",
                       @"icon" : @"lufy.png",
                       @"age" : @20,
                       @"height" : @"1.55",
                       @"money" : @100.9,
                       @"sex" : @(SexFemale),
                       @"gay" : @"true"
                       };
//转换
User *user = [User mj_objectWithKeyValues:dict];
2.模型中嵌套模型
NSDictionary *dict = @{
                       @"name" : @"Agree!Nice weather!",
                       @"user" : @{
                               @"name" : @"Jack",
                               @"icon" : @"lufy.png"
                               },
                       @"retweetedStatus" : @{
                               @"text" : @"Nice weather!",
                               @"user" : @{
                                       @"name" : @"Rose",
                                       @"icon" : @"nami.png"
                                       }
                               }
                       };
//转换
Status *status = [Status mj_objectWithKeyValues:dict];
3.模型中有个数组属性,数组里面又要装着其他模型
// 1.需要设置数组中包含哪些model key:属性名字 value:包含的model名字
[StatusResult mj_setupObjectClassInArray:^NSDictionary *{
    return @{
             @"statuses" : @"Status",
             // @"statuses" : [Status class],
             @"ads" : @"Ad"
             // @"ads" : [Ad class]
             };
}];
或者在相关类的.m文件中实现   
/**
*  数组中需要转换的模型类
*
*  @return 字典中的key是数组属性名,value是数组中存放模型的Class(Class类型或者NSString类型)
*/ 
+ (NSDictionary *)mj_replacedKeyFromPropertyName;
//2.
NSDictionary *dict = @{
                       @"totalNumber" : @"2014",
                       
                       @"statuses" : @[
                               @{
                                   @"text" : @"Nice weather!",
                                   @"user" : @{
                                           @"name" : @"Rose",
                                           @"icon" : @"nami.png"
                                           }
                                   },
                               @{
                                   @"text" : @"Go camping tomorrow!",
                                   @"user" : @{
                                           @"name" : @"Jack",
                                           @"icon" : @"lufy.png"
                                           }
                                   }
                               ],
                       @"ads" : @[
                               @{
                                   @"image" : @"ad01.png",
                                   @"url" : @"http://www.ad01.com"
                                   },
                               @{
                                   @"image" : @"ad02.png",
                                   @"url" : @"http://www.ad02.com"
                                   }
                               ]
                       };
//转换
StatusResult *result = [StatusResult mj_objectWithKeyValues:dict];

注意不要忘了告诉MJExtension数组中包含的模型

3. 字典数组转成模型数组
NSArray *dictArray = @[
                       @{
                           @"name" : @"Jack",
                           @"icon" : @"lufy.png"
                           },
                       @{
                           @"name" : @"Rose",
                           @"icon" : @"nami.png"
                           }
                       ];

//转换
NSArray *userArray = [User mj_objectArrayWithKeyValuesArray:dictArray];
4.模型转字典
User *user = [[User alloc] init];
user.name = @"Jack";
user.icon = @"lufy.png";

Status *status = [[Status alloc] init];
status.user = user;
status.text = @"Nice mood!";
//转换
NSDictionary *statusDict = status.mj_keyValues;
5. 模型数组转字典数组
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];
//转换
NSArray *dictArray = [User mj_keyValuesArrayWithObjectArray:userArray];
6. 允许转换哪些属性
//在.m中实现
+ (NSArray *)mj_allowedPropertyNames;//只有这个数组中的属性名才允许进行字典和模型的转换
或者相关Model调用
+ (void)mj_setupAllowedPropertyNames:(MJAllowedPropertyNames)allowedPropertyNames;
7.忽略哪些属性转换
//在.m中实现
+ (NSArray *)mj_ignoredPropertyNames;
或者相关Model调用
+ (void)mj_setupIgnoredPropertyNames:(MJIgnoredPropertyNames)ignoredPropertyNames;
8. 将属性名换为其他key去字典中取值
//.m中实现
// 字典中的key是属性名,value是从字典中取值
+ (NSDictionary *)mj_replacedKeyFromPropertyName;
9.转换完成后的回调
// 当字典转模型完毕时调用
- (void)mj_keyValuesDidFinishConvertingToObject;
//  当模型转字典完毕时调用
- (void)mj_objectDidFinishConvertingToKeyValues;

若有需要只需在相关类中实现以上方法即可

四:注意事项

1.首先要分析需要转换的数据结构调用正确的API.
2.遇到结构比较复杂的数据后,可以考虑分层转换,不一定每一层都要按照固定的模式去转换.
3.转换嵌套结构的时候,一定要注意看是否需要实现某些方法告诉MJExtension包含哪些模型.

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

推荐阅读更多精彩内容

  • 世界上转换速度最快、使用最简单方便的字典转模型框架 能做什么? MJExtension是一套字典和模型之间互相转换...
    今年27阅读 757评论 0 1
  • GitHub源码:MJExtension star: 8.3k ⭐️⭐️⭐️ 以下内容来源于官方源码、 READM...
    独木舟的木阅读 3,103评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • MJExtension是一套字典和模型之间互相转换的超轻量级框架 1、字典(JSON) --> 模型(Model)...
    艳晓阅读 1,604评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,945评论 4 60