YModel 是一个高效的 iOS/OSX 的模型转换框架,可以轻松地将 JSON 转换成 Model,或者将 Model 转换成 JSON。以下是详细的使用指南:
- 导入 YYModel: 确保在你的项目中导入了 YYModel。使用 CocoaPods 的话可以在 Podfile 中加入以下代码:
1pod 'YYModel'
然后执行 pod install
。
- 创建 Model 类: 对于 JSON 数据,先创建一个对应的 Model 类。比如 JSON 长这样:
1{ 2 "uid": 123456, 3 "name": "John", 4 "created": "2016-07-23T08:49:22Z" 5}
创建对应的 Objective-C 类:
1#import <YYModel.h> 2 3@interface User : NSObject 4@property (nonatomic, assign) NSUInteger uid; 5@property (nonatomic, copy) NSString *name; 6@property (nonatomic, strong) NSDate *created; 7@end 8 9@implementation User 10@end
- JSON 转 Model: 使用 YYModel 的
yy_modelWithJSON:
方法可以快速将 JSON 数据转为 Model 对象。
1NSDictionary *jsonDictionary = @{ 2 @"uid": @123456, 3 @"name": @"John", 4 @"created": @"2016-07-23T08:49:22Z" 5}; 6 7User *user = [User yy_modelWithJSON:jsonDictionary];
- Model 转 JSON: 将 Model 对象转换回 JSON 字典或者 JSON 字符串非常简单:
1// 转换成 JSON 字典 2NSDictionary *jsonDict = [user yy_modelToJSONObject]; 3 4// 转换成 JSON 字符串 5NSString *jsonString = [user yy_modelToJSONString];
- 自定义 Model 映射: 如果 JSON 的字段名与 Model 的属性名不一致,或者需要做一些额外的处理,可以通过在 Model 类中实现
+ (NSDictionary *)modelCustomPropertyMapper
方法来自定义映射关系:
1@implementation User 2 3// 指定 JSON 字段与 Model 属性之间的映射 4+ (NSDictionary *)modelCustomPropertyMapper { 5 return @{ 6 @"uid" : @"id", 7 @"name" : @"n", 8 @"created" : @"time" 9 }; 10} 11 12@end
- 处理复杂的嵌套结构: 对于更复杂的嵌套 JSON,例如数组中包含其他 Model 对象,可以通过实现
+ (NSDictionary *)modelContainerPropertyGenericClass
方法来指定子 Model 类型:
1@interface Blog : NSObject 2@property (nonatomic, copy) NSString *title; 3@property (nonatomic, strong) NSArray<User *> *authors; 4@end 5 6@implementation Blog 7 8// 指定 authors 数组中包含的是 User 类型的对象 9+ (NSDictionary *)modelContainerPropertyGenericClass { 10 return @{ 11 @"authors" : [User class] 12 }; 13} 14 15@end
使用上面的方法,YYModel 可以处理大多数常见的 JSON 转 Model 的需求。另外,YYModel 还支持 Model 编码(NSCoding)和复制(NSCopying)协议,让您的 Model 对象可以进行归档存储和复制操作。
objectC YYModel超级详细使用
GPT4_Turbo_128K
YYModel是一个轻量级的库,用于在Objective-C中将JSON与Model对象进行转换。以下是一些基本和高级用法的详细指导:
基本用法
将JSON(NSDictionary/NSString/NSData)转换为Model
1// 假设你有一个User类 2@interface User : NSObject 3@property (nonatomic, assign) UInt64 uid; 4@property (nonatomic, copy) NSString *name; 5@property (nonatomic, strong) NSDate *created; 6@end 7 8// JSON转换为User对象 9NSDictionary *jsonDictionary = @{ 10 @"uid": @123456, 11 @"name": @"John", 12 @"created": @"2016-07-23T08:49:22Z" 13}; 14User *user = [User yy_modelWithJSON:jsonDictionary];
将Model转换为JSON
1// User对象转JSON对象 2NSDictionary *json = [user yy_modelToJSONObject];
自定义映射
如果Model的属性名和JSON的key不一样,可以在Model中重写+modelCustomPropertyMapper
方法。
1@interface User : NSObject 2@property (nonatomic, assign) UInt64 userId; 3@property (nonatomic, copy) NSString *userName; 4@property (nonatomic, strong) NSDate *createdAt; 5@end 6 7@implementation User 8// 自定义映射 9+ (NSDictionary *)modelCustomPropertyMapper { 10 return @{@"userId" : @"uid", 11 @"userName" : @"name", 12 @"createdAt" : @"created"}; 13} 14@end
处理复杂结构
对于JSON中包含数组和嵌套的Model,需要指定数组中对象的类型。
1@interface Book : NSObject 2@property (nonatomic, copy) NSString *title; 3@property (nonatomic, strong) NSArray<User *> *authors; 4@end 5 6@implementation Book 7// 告诉YYModel数组authors中存放的对象是User类型 8+ (NSDictionary *)modelContainerPropertyGenericClass { 9 return @{@"authors" : [User class]}; 10} 11@end
自定义转换
如果转换过程中需要一些特殊的处理,可以重写-modelCustomTransformFromDictionary:
和-modelCustomTransformToDictionary:
方法。
1@implementation User 2// 从JSON转换到Model之前的自定义处理 3- (BOOL)modelCustomTransformFromDictionary:(NSDictionary *)dic { 4 if (![dic[@"created"] isKindOfClass:[NSString class]]) return NO; 5 6 // 对created字段进行自定义转换,比如日期格式转换 7 NSString *createdStr = dic[@"created"]; 8 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 9 formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ"; 10 _created = [formatter dateFromString:createdStr]; 11 12 return YES; 13} 14 15// 从Model转换到JSON之前的自定义处理 16- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic { 17 // 对NSDate类型的created属性转换成字符串 18 if (!_created) return NO; 19 20 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 21 formatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ssZ"; 22 dic[@"created"] = [formatter stringFromDate:_created]; 23 24 return YES; 25} 26@end
编码和解码
YYModel也支持NSCoding协议,可以很容易地对Model对象进行归档和解档。
1// User遵循NSCoding协议 2@interface User : NSObject <NSCoding> 3//...属性声明 4@end 5 6// 归档 7[NSKeyedArchiver archiveRootObject:user toFile:path]; 8 9// 解档 10User *unarchivedUser = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
如果Model有遵守NSCoding,YYModel会自动使用这些协议方法进行编码和解码。
复制
YYModel还支持NSCopying协议,可以实现对象的复制。
1// User遵循NSCopying协议 2@interface User : NSObject <NSCopying> 3//...属性声明 4@end 5 6// 实现复制方法 7- (id)copyWithZone:(NSZone *)zone { 8 return [self yy_modelCopy]; 9} 10 11// 使用 12User *userCopy = [user copy];
注意事项
- JSON的key是大小写敏感的,所以需要确保映射是正确的。
- 在处理时间戳或其他数据格式转换时,碰到非法格式应该返回NO,避免数据错误。
- 使用
yy_modelWithJSON:
或者yy_modelToJSONObject
时,确保传递的对象是有效的JSON对象。 - YYModel的性能非常好,在大多数情况下,甚至优于手动编写的Model转换代码。
这些就是YYModel的超级详细使用指南,通过以上方法,你应该可以应对大部分Model与JSON转换的情况