NSObject 分类,它可以从 JSON 字典递归地自动填充对象属性。
我们有这样的模型
@interface FBUser : NSObject
@property (nonatomic, strong) NSString *ident;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, strong) NSString *lastName;
@property (nonatomic, strong) NSURL *link;
// array of FBWork objects
@property (nonatomic, strong) NSArray *work;
@property (nonatomic, strong) NSString *gender;
@property (nonatomic) NSInteger timezone;
@property (nonatomic, strong) NSString *locale;
@property (nonatomic, getter=isVerified) BOOL verified;
@property (nonatomic, strong) NSDate *updatedTime;
@property (nonatomic, strong) NSString *username;
@end
我们需要指定 propertyMap 键,用于从不同名称的 JSON 结构中获取属性
//FBWork.m
- (NSDictionary *)propertyMap
{
return @{@"id": @"ident",
@"first_name": @"firstName",
@"last_name": @"lastName",
@"updated_time": @"updatedTime"};
}
我们还需要指定哪些类型的对象包含数组操作。
//FBWork.m
- (Class)classForElementsInArrayProperty:(NSString *)propertyName
{
return [FBWork class];
}
如果对象实现了 initWithJSON:
,则按这种方式初始化。如果没有实现,则通过其 init
方法初始化,然后通过 fillWithJSON:
方法填充。
我们需要使用正确的指定初始化器创建我们的 NSManagedObjects,因此我们向实现 initWithJSON:
方法的 NSManagedObject 添加分类。
@implementation NSManagedObject (MUResponseObject)
- (NSManagedObject *)initWithJSON:(id)JSON
{
NSManagedObjectContext *context = nil; // get your context if you want, e.g. from singleton object
if(self = [self initWithContext:context])
{
[self fillWithJSON:JSON];
}
return self;
}
- (NSManagedObject *)initWithContext:(NSManagedObjectContext *)context
{
NSString *entityName = NSStringFromClass([self class]);
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
if(self = [self initWithEntity:entity insertIntoManagedObjectContext:context])
{
}
return self;
}
如果您使用 AFNetworking,请参阅 AFNetworking-MUResponseSerializer
CocoaPods 是一个 Objective-C 的依赖管理器,它自动并简化了在项目中使用第三方库(如 AFNetworking)的过程。有关更多信息,请参阅 "Cocoapod.org" 指南。
platform :ios, '7.0'
pod "NSObject-MUJSONMapping"