此心安處 便是吾鄉
前言
之前一直用的是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];