项目地址: https://github.com/Mantle/Mantle
今年上半年在两个项目中都将Model层替换为Mantle,大大减少了开发中实体转换的时间;选择mantle的初衷是因为看到了大神的blog,里面的应用场景也是在开发中我们经常遇到的情况:
iWangKe.me - 为什么唱吧iOS 6.0选择了Mantle
对比一下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # http://bubbler.labs.douban.com/j/user/wheats
{ "homepage": "http://www.douban.com/people/wheats", "icon": "http://img3.douban.com/icon/u46721592-5.jpg", "userid": "46721592", "r": 0, "stats": { "board": 0, "bub": 0, "collect": 0 }, "title": "welsonla", "uid": "wheats" }
|
You should know:
- 使用Mantle需要继承MTLModel
- 如果需要将实体中的某个字段映射成一个实体或者实体的数组,需要继承MTLJSONSerializing
- Mantle需要一个字典来讲字典中的字段与实体的字段进行匹配
将JSON转换为制定的Model
1
| MDoubanUser *allModel = [MTLJSONAdapter modelOfClass:[MDoubanUser class] fromJSONDictionary:rstlDict] error:nil]
|
将JSON中的数组转换为Model的数组
1
| NSArray *users = [MTLJSONAdapter modelsOfClass:[MDoubanUser class] fromJSONArray:userArray error:nil];
|
将某个字段对应到某个实体
1 2 3 4 5 6 7 8 9 10 11
| +(NSValueTransformer *)JSONTransformerForKey:(NSString *)key{
if ([key isEqualToString:@"stats"]) { #假设上诉到json中的stats创建了一个单独的实体类为MStats, return [MTLJSONAdapter dictionaryTransformerWithModelClass:[MStats class]]; }else if([key isEqualToString:@"books"]){ #假设中json中有一个books数组,并有对应的实体MBook return return [MTLJSONAdapter arrayTransformerWithModelClass:[MBook class]];; } return nil; }
|
自定义转换
自定义转换只要定义一个字段名+JSONTransformer结尾的方法,就会执行我们自定义的转换,比如时间格式化,对某些字符进行一些操作处理
1 2 3 4 5 6
| # 将uid前面加上"Author" + (NSValueTransformer *)uidJSONTransformer{ return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *uid, BOOL *success, NSError *__autoreleasing *error) { return [@"Author: " stringByAppendingString:uid]; }]; }
|
多个字段对应
在项目中,经常遇到,接口A返回的用户id字段说uid,接口B返回的用户字段是ID,这种情况我们只需要中Model中将两个字段存到一个数组绑定到同一个属性上就可以了
1 2 3 4 5 6 7 8 9 10 11 12
| + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ @"uid":@[@"uid",@"ID"], @"userid":@"userid", @"stats":@"stats", @"title":@"title", @"r":@"r", @"homepage":@"homepage", @"icon":@"icon" }; }
|
将实体中的值封装成一个dictionary,方便接口传输
1 2 3 4 5
| #使用全部的字段 NSDictionary *params = [user dictionaryValue];
#使用部分的字段 NSDictionary *params = [address dictionaryWithValuesForKeys:@[@"uid",@"stats",@"homepage"]];
|
最后
在项目的开发过程中,我抽时间做了一个小工具,可以方便的将JSON转换为Mantle支持的Model类,希望对你们有帮助
Source: https://github.com/TimeBots/ModelBot
Download: ModelBot Download