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都会用到,所以写在基类就好。
MJCodingImplementation
一、常用方法——Model中
1.1
+ (void)mj_setupObjectClassInArray:(MJObjectClassInArray)objectClassInArray
该方法在model中用于说明 数组属性,该属性数组中存放那种类型的model,写在init方法内部
- (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;
}
1.2
+ (void)mj_setupReplacedKeyFromPropertyName:(MJReplacedKeyFromPropertyName)replacedKeyFromPropertyName
该方法在model中用于处理属性名和JSON中key值不同的情况,将属性名和key进行对应并替换。写在init方法内部
- (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;
}
二、常用方法——将JSON格式转Model
2.1
+ (instancetype)mj_objectWithKeyValues:(id)keyValues
字典转模型,复合字典转模型,嵌套(数组)字典转模型 JSON字符串转模型都会用到这个方法。以下仅仅是一个事例,本Demo可以通过文字末尾链接查看。
// 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
}
2.2
+ (NSMutableArray *)mj_objectArrayWithKeyValuesArray:(NSArray *)keyValuesArray
JSON数组转成模型数组。这个也是非常常用的。
-(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
}
三、常用方法——将Model转JSON
3.1
- (NSMutableDictionary *)mj_keyValues
-(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; } */
}
3.2
+ (NSMutableArray *)mj_keyValuesArrayWithObjectArray:(NSArray *)objectArray
// 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);
简单使用小Demo:
https://github.com/zhangyanxiao/MJExtensionDemo
MJ:
https://github.com/CoderMJLee/MJExtension