一, 簡介
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包含哪些模型.