吐槽
不吐不快
这玩意儿相比起MJExtension
来说难用至极.
首先要添加JSON中的key与property名称的映射
接着还要将所有的property名字加上一个JSONTransformer
的后缀,去实现一个协议方法,复杂的要死.
无奈公司已经封装了这一套,不得不花点时间来学习下
步骤
假设一个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;//可能需要转化的类, 字符串转日期
@property (nonatomic, copy, readonly) NSArray<ActivityTag*> *array;//数组类, 必须指定类型
@end
先添加映射,JSON <==> properties
格式为: property名字
:JSON key
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"URL": @"url",
@"state": @"state",
@"reporterLogin": @"login",
@"assignee": @"assignee",
@"updatedAt": @"updated_at"
@"array":@"infos"
};
}
属性特殊需要作变形处理
需要去实现一个类方法,在属性名后加一个JSONTransformer
例如属性名为 state
, 那么需要添加
+ (NSValueTransformer *)stateStatusTransformer
出现以下几种情况时,需要添加 变形处理(JSONTransformer
)
- string 转 URL
- 枚举类型,需要添加映射,将所有枚举值一一告知
- 数组类性,需要告知数组内约束的类类型
- 自定义类类型,需要告知自定义的类类型
- 普通需求需要作特定转化的类
- 需要对这个类做类型转化,比如字符串转日期
下面一一来说明
-- string转URL
+ (NSValueTransformer *)URLJSONTransformer {
return [NSValueTransformer valueTransformerForName:MTLURLValueTransformerName];
}
-- 枚举映射
+ (NSValueTransformer *)stateJSONTransformer {
return [NSValueTransformer mtl_valueMappingTransformerWithDictionary:@{
@"open": @(GHIssueStateOpen), //左边是JSON key,右侧是枚举中的实际值
@"closed": @(GHIssueStateClosed)
}];
}
-- 数组
+ (NSValueTransformer *)arrayJSONTransformer {
return [MTLJSONAdapter arrayTransformerWithModelClass:[ActivityTag class]];
}
-- 自定义类
+ (NSValueTransformer *)assigneeJSONTransformer {
return [MTLJSONAdapter dictionaryTransformerWithModelClass:GHUser.class];
}
-- 需要特殊转化, 字符串转日期
+ (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];
}];
}