作为iOS开发的著名三方库YYKit可以说是家喻户晓,是一个集大成的开源库,今天我们说一下关于旗下的JSON转换功能小技巧
1 JSON转模型的白名单
+ (NSArray *)modelPropertyBlacklist
+ (NSArray *)modelPropertyWhitelist
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {NSNumber *timestamp = dic[@"timestamp"];if (![timestamp isKindOfClass:[NSNumber class]]) return NO;_createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];return YES;}
// 当 Model 转为 JSON 完成后,该方法会被调用。// 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model 会被忽略。// 你也可以在这里做一些自动转换不能完成的工作。- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {if (!_createdAt) return NO;dic[@"timestamp"] = @(n.timeIntervalSince1970);return YES;}
#define YYModelWhiteList(array) + (NSArray *)modelPropertyWhitelist {\ return array;\}\
#define YYModelCustomPropertyMapper(dict) + (NSDictionary *)modelCustomPropertyMapper {\return (dict) ;\}\
// 返回容器类中的所需要存放的数据类型 (以 Class 或 Class Name 的形式)。#define YYModelContainerPropertyGenericClass(dict) + (NSDictionary *)modelContainerPropertyGenericClass {\ return dict ;\}\
#define YYModelCommon - (NSString *)description {\ return [self modelDescription];\}\- (void)encodeWithCoder:(NSCoder *)aCoder {\ [self modelEncodeWithCoder:aCoder];\}\- (id)initWithCoder:(NSCoder *)aDecoder {\ self = [super init];\ return [self modelInitWithCoder:aDecoder];\}\- (id)copyWithZone:(NSZone *)zone {\ return [self modelCopy];\}\- (NSUInteger)hash {\ return [self modelHash];\}\- (BOOL)isEqual:(id)object {\ return [self modelIsEqual:object];\}\
#define YYModelDate( array ) - (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {\NSMutableArray * items = [NSMutableArray arrayWithArray:@[@"createTime",@"updateTime"]];\ [items addObjectsFromArray:array];\ for (NSString *item in items) {\ NSNumber *timestamp = dic[item];\ if (![timestamp isKindOfClass:[NSNumber class]]) return NO;\ NSDate * dateItem = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue/1000];\ [self setValue:dateItem forKey:item];\ }\ return YES;\}\
那么怎么使用呢?
比如这么用
@implementation UserInfo
YYModelCommon
YYModelCustomPropertyMapper(@{
})
//YYModelDate(@[])
@end
比如这么用
@implementation InfoNewHot
YYModelCommon
YYModelContainerPropertyGenericClass((@{
@"list":NewHot.class
}))
@end
@implementation NewHot
YYModelCommon
YYModelDate((@[]))
@end