吐槽
不吐不快
這玩意兒相比起MJExtension
來說難用至極.
首先要添加JSON中的key與property名稱的映射
接著還要將所有的property名字加上一個(gè)JSONTransformer
的后綴,去實(shí)現(xiàn)一個(gè)協(xié)議方法,復(fù)雜的要死.
無奈公司已經(jīng)封裝了這一套,不得不花點(diǎn)時(shí)間來學(xué)習(xí)下
步驟
假設(shè)一個(gè)DIY類
typedef enum : NSUInteger {
GHIssueStateOpen,
GHIssueStateClosed
} GHIssueState;
@interface DIY : MTLModel <MTLJSONSerializing>
@property (nonatomic, copy, readonly) NSURL *URL;
@property (nonatomic, assign, readonly) GHIssueState state; //枚舉類
@property (nonatomic, copy, readonly) NSString *reporterLogin;//普通類
@property (nonatomic, strong, readonly) GHUser *assignee;//自定義類
@property (nonatomic, copy, readonly) NSDate *updatedAt;//可能需要轉(zhuǎn)化的類, 字符串轉(zhuǎn)日期
@property (nonatomic, copy, readonly) NSArray<ActivityTag*> *array;//數(shù)組類, 必須指定類型
@end
先添加映射,JSON <==> properties
格式為: property名字
:JSON key
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"URL": @"url",
@"state": @"state",
@"reporterLogin": @"login",
@"assignee": @"assignee",
@"updatedAt": @"updated_at"
@"array":@"infos"
};
}
屬性特殊需要作變形處理
需要去實(shí)現(xiàn)一個(gè)類方法,在屬性名后加一個(gè)JSONTransformer
例如屬性名為 state
, 那么需要添加
+ (NSValueTransformer *)stateStatusTransformer
出現(xiàn)以下幾種情況時(shí),需要添加 變形處理(JSONTransformer
)
- string 轉(zhuǎn) URL
- 枚舉類型,需要添加映射,將所有枚舉值一一告知
- 數(shù)組類性,需要告知數(shù)組內(nèi)約束的類類型
- 自定義類類型,需要告知自定義的類類型
- 普通需求需要作特定轉(zhuǎn)化的類
- 需要對(duì)這個(gè)類做類型轉(zhuǎn)化,比如字符串轉(zhuǎn)日期
下面一一來說明
-- string轉(zhuǎn)URL
+ (NSValueTransformer *)URLJSONTransformer {
return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}
-- 枚舉映射
+ (NSValueTransformer *)stateJSONTransformer {
return [NSValueTransformer mtl_valueMappingTransformerWithDictionary:@{
@"open": @(GHIssueStateOpen), //左邊是JSON key,右側(cè)是枚舉中的實(shí)際值
@"closed": @(GHIssueStateClosed)
}];
}
-- 數(shù)組
+ (NSValueTransformer *)arrayJSONTransformer {
return [MTLJSONAdapter arrayTransformerWithModelClass:[ActivityTag class]];
}
-- 自定義類
+ (NSValueTransformer *)assigneeJSONTransformer {
return [MTLJSONAdapter dictionaryTransformerWithModelClass:GHUser.class];
}
-- 需要特殊轉(zhuǎn)化, 字符串轉(zhuǎn)日期
+ (NSDateFormatter *)dateFormatter {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'";
return dateFormatter;
}
+ (NSValueTransformer *)updatedAtJSONTransformer {
return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) {
return [self.dateFormatter dateFromString:dateString];
} reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) {
return [self.dateFormatter stringFromDate:date];
}];
}