YYModel使用
1.自定义属性映射
+ (nullable NSDictionary<NSString *, id> *)modelCustomPropertyMapper;
例子:
//自定义类的属性
@property NSString *name;
@property NSInteger page;
@property NSString *desc;
@property NSString *bookID;
//JSON
{
"n":"Harry Pottery",
"p": 256,
"ext" : {
"desc" : "A book written by J.K.Rowing."
},
"id" : 100010
}
//custom属性,让 json key 映射到 对象的属性。 该方法在自
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"name" : @"n",
@"page" : @"p",
@"desc" : @"ext.desc", //key.path
@"bookID" : @[@"ID",@"id",@"book_id"]};
//从 json 过来的key 可以是id,ID,book_id。例子中 key 为 id。
}
使用这个方法需要在自定义类里面重写该方法。
2.自定义容器映射
假如你的对象里面有容器(set,array,dic),你可以指定类型中的对象类型,因为YYModel
是不知道你容器中储存的类型的。在dic
中,你指定的是它value
的类型。
+ ( NSDictionary<NSString *, id> *)modelContainerPropertyGenericClass;
@interface YYAuthor : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSDate *birthday;
@end
@interface User : NSObject
@property UInt64 uid;
@property NSString *bookname;
@property (nonatomic, strong) NSMutableArray<YYAuthor *> *authors;
@end
//Json数据
{
"uid":123456,
"bookname":"Harry",
"authors":[
{
"birthday":"1991-07-31T08:00:00+0800",
"name":"G.Y.J.jeff"
},
{
"birthday":"1990-07-31T08:00:00+0800",
"name":"Z.Q.Y,jhon"
}
]
}
\\相当于泛型说明
+ (NSDictionary *)modelContainerPropertyGenericClass {
return @{@"authors" : [YYAuthor class]};
}
3.根据字典返回类型
这个方法是可以根据字典里面的数据来指定当前对象的类型。
我对这个方法的理解,假如Person
是父类,其子类是Man
,Woman
。这个时候你可以根据dic["sex"]
中的value
,比如value
为NSString
的Man
,在重写的方法里 return Man
.这个时候,你当前的字典转模型的实例就是Man
的实例对象。
注:这就是多态
+ (nullable Class)modelCustomClassForDictionary:(NSDictionary*)dictionary;
//.h
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger age;
@end
@interface Man : Person
@property (nonatomic, copy) NSString *wifeName;
@end
@interface Woman : Person
@property (nonatomic, copy) NSString *husbandName;
@end
//.m
+ (Class)modelCustomClassForDictionary:(NSDictionary*)dictionary {
if (dictionary[@"sex"] != nil) {
NSString *runClass = dictionary[@"sex"];
return NSClassFromString(runClass);
} else {
return [self class];
}
}
NSData *dataPerson = [self dataWithPath:@"person"];
Person *person = [Person modelWithJSON:dataPerson];
[person modelDescription];
这个时候你会发现,当前person的类实际上是 Man,而不是 Person。
4.白名单,黑名单
+ (nullable NSArray<NSString *> *)modelPropertyBlacklist; 黑名单
+ (nullable NSArray<NSString *> *)modelPropertyWhitelist;; 白名单
这两个比较简单。
黑名单,故名思议,黑名单中的属性不会参与字典转模型。
白名单使用比较极端,你用了之后,只有白名单中的属性会参与字典转模型,其他属性都不参与。不推荐使用。
5.更改字典信息
该方法发生在字典转模型之前。 最后对网络字典做一次处理。
- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic;
.h文件
#import <Foundation/Foundation.h>
/*
{
"name":"Jeff",
"age":"26",
"sex":"Man",
"wifeName":"ZQY"
}
*/
@interface Person : NSObject
@property NSString *name;
@property NSString *age;
@property NSString *sex;
@property NSString *wifeName;
@end
.m文件
#import "Person.h"
#import <YYModel.h>
@implementation Person
- (NSDictionary *)modelCustomWillTransformFromDictionary:(NSDictionary *)dic {
if ([dic[@"sex"] isEqualToString:@"Man"]) {
return nil;//这里简单演示下,直接返回 nil。相当于不接受男性信息。
}
return dic;//女性则不影响字典转模型。
}
@end
测试
//原来json
{
"name":"Jeff",
"age":"26",
"sex":"Man",
"wifeName":"ZQY"
}
//更改后json
{
"name":"Jeff",
"age":"26",
"sex":"Woman",
"wifeName":"ZQY"
}
6.字典转模型补充
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic;
#import <Foundation/Foundation.h>
User模型
.h文件
/*
{
"uid":123456,
"bookname":"Harry",
"created":"1965-07-31T00:00:00+0000",
"timestamp" : 1445534567
}
*/
@interface User : NSObject
@property UInt64 uid;
@property NSDate *created;
@property NSDate *createdAt;
@property NSString *bookname;
@end
.m文件
#import "User.h"
#import <YYModel.h>
@implementation User
- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic {
NSNumber *timestamp = dic[@"timestamp"];
if (![timestamp isKindOfClass:[NSNumber class]]) return NO;
_createdAt = [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];
return YES;
}
@end
实现
User *user = [User yy_modelWithDictionary:@{
@"uid":@123456,
@"bookname":@"Harry",
@"created":@"1965-07-31T00:00:00+0000",
@"timestamp" :@1445534567
}];
NSLog(@"%@",user);
字典转模型结束后createdAt
属性应该是空的,因为timestamp
和 createdAt
不一样。但你在这里赋值,手动把timestamp
的属性赋值给_createdAt
.这个有点类似第一点的 自定义属性映射(本篇文章第一条)。
注:此处如果return NO
,dic->model
将失败。
7.模型转字典补充
- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic;
这个方法和第6条是相对应的关系。这里是model->json
的补充。
假如自己model 中有_createdAt,那 model 转到 json 中的timestamp
会被赋值。
注:此处如果 return NO,model->dict将失败。
.m文件
//模型转字典补充
-(BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {
if (!_createdAt) return NO;
dic[@"timestamp"] = @(_createdAt.timeIntervalSince1970);
return YES;
}
测试
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
User *user = [User yy_modelWithDictionary:@{
@"uid":@123456,
@"bookname":@"Harry",
@"created":@"1965-07-31T00:00:00+0000",
@"timestamp" :@1445534567
}];
NSLog(@"%@",user);
NSString *userStr = [user yy_modelToJSONString];
NSLog(@"%@",userStr);
}
结果如图:
8.字典用法和数组的用法
+ (nullable NSArray *)yy_modelArrayWithClass:(Class)cls json:(id)json;
+ (nullable NSDictionary *)yy_modelDictionaryWithClass:(Class)cls json:(id)json;
模型
#import <Foundation/Foundation.h>
/*
[{"birthday":"1991-07-31T08:00:00+0800",
"name":"G.Y.J.jeff"},
{"birthday":"1990-07-31T08:00:00+0800",
"name":"Z.Q.Y,jhon"}]
*/
@interface Author : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSString *birthday;
@end
实现
NSArray *array = @[@{@"birthday":@"1991-07-31T08:00:00+0800",
@"name":@"G.Y.J.jeff"},
@{@"birthday":@"1990-07-31T08:00:00+0800",
@"name":@"Z.Q.Y,jhon"}];
NSArray *arrT = [NSArray yy_modelArrayWithClass:[Author class] json:array];
NSLog(@"arrT = %@",arrT);
结果如图: