RestKit 与 NSDictionary 和 NSArray 对象的映射
RestKit mapping with NSDictionary and NSArray object
{"coord":{"lon":72.62,"lat":23.03},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"base":"stations","main":{"temp":303.082,"pressure":1014.85,"humidity":66,"temp_min":303.082,"temp_max":303.082,"sea_level":1018.46,"grnd_level":1014.85},"wind":{"speed":1.07,"deg":340.501},"rain":{"3h":0.435},"clouds":{"all":76},"dt":1475333911,"sys":{"message":0.0033,"country":"IN","sunrise":1475283682,"sunset":1475326567},"id":1279233,"name":"Ahmadabad","cod":200}
以上是我的 API 回复。
现在我想要映射 "weather" 和 "name" 并且想要相同的对象作为响应。
我可以创建到class
@interface WeatherStatus : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) WeatherInfo *info;
@end
和
@interface WeatherInfo : NSObject
@property (nonatomic, copy) NSString *description;
@property (nonatomic, copy) NSString *icon;
下面是映射代码。
RKObjectMapping *weatherInfo = [RKObjectMapping mappingForClass:[WeatherInfo class]];
[weatherInfo addAttributeMappingsFromDictionary:@{@"description": @"description", @"icon": @"icon"}];
RKObjectMapping *weatherStatus = [RKObjectMapping mappingForClass:[WeatherStatus class]];
[weatherStatus addAttributeMappingsFromArray:@[@"name"]];
[weatherStatus addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"weather" toKeyPath:@"weather" withMapping:weatherInfo]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:weatherStatus method:RKRequestMethodGET pathPattern:nil keyPath:@"weather" statusCodes:nil];
[objectManager addResponseDescriptor:responseDescriptor];
NSDictionary *queryParams;
queryParams = [NSDictionary dictionaryWithObjectsAndKeys:kAPP_KEY, @"appid", @"Ahmedabad", @"q", nil];
[[RKObjectManager sharedManager] getObjectsAtPath:@"/data/2.5/weather" parameters:queryParams success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
WeatherStatus *obj = [mappingResult.array objectAtIndex:0];
NSLog(@"info %@",obj.info);
NSLog(@"name %@",obj.name);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"What do you mean by 'there is no coffee?': %@", error);
}];
我得到
info (null)
name (null)
谁能告诉我哪里错了?
我已经看过了RestKit complex and simple JSON RKObjectMapping almost working, but
不要使用 description
作为 属性 名称,这只会给您带来麻烦。请改用 overview
或类似的东西。
在JSON中,天气是一个数组,所以你应该把你的天气(信息)属性设为NSArray
,并确保映射中的名称和属性 匹配。
我将 "WeatherStatus" class 中信息对象的 属性 更改为 NSArray。
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSArray *weather;
这里修改映射代码
RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[WeatherStatus class]];
[venueMapping addAttributeMappingsFromDictionary:@{@"name": @"name"}];
RKObjectMapping *locationMapping = [RKObjectMapping mappingForClass:[WeatherInfo class]];
[locationMapping addAttributeMappingsFromDictionary:@{@"description": @"description",@"icon":@"icon"}];
[venueMapping addRelationshipMappingWithSourceKeyPath:@"weather" mapping:locationMapping];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping method:RKRequestMethodGET pathPattern:nil keyPath:nil statusCodes:nil];
[objectManager addResponseDescriptor:responseDescriptor];
添加与 WeatherStatus 的关系映射 class。
{"coord":{"lon":72.62,"lat":23.03},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"base":"stations","main":{"temp":303.082,"pressure":1014.85,"humidity":66,"temp_min":303.082,"temp_max":303.082,"sea_level":1018.46,"grnd_level":1014.85},"wind":{"speed":1.07,"deg":340.501},"rain":{"3h":0.435},"clouds":{"all":76},"dt":1475333911,"sys":{"message":0.0033,"country":"IN","sunrise":1475283682,"sunset":1475326567},"id":1279233,"name":"Ahmadabad","cod":200}
以上是我的 API 回复。
现在我想要映射 "weather" 和 "name" 并且想要相同的对象作为响应。
我可以创建到class
@interface WeatherStatus : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) WeatherInfo *info;
@end
和
@interface WeatherInfo : NSObject
@property (nonatomic, copy) NSString *description;
@property (nonatomic, copy) NSString *icon;
下面是映射代码。
RKObjectMapping *weatherInfo = [RKObjectMapping mappingForClass:[WeatherInfo class]];
[weatherInfo addAttributeMappingsFromDictionary:@{@"description": @"description", @"icon": @"icon"}];
RKObjectMapping *weatherStatus = [RKObjectMapping mappingForClass:[WeatherStatus class]];
[weatherStatus addAttributeMappingsFromArray:@[@"name"]];
[weatherStatus addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"weather" toKeyPath:@"weather" withMapping:weatherInfo]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:weatherStatus method:RKRequestMethodGET pathPattern:nil keyPath:@"weather" statusCodes:nil];
[objectManager addResponseDescriptor:responseDescriptor];
NSDictionary *queryParams;
queryParams = [NSDictionary dictionaryWithObjectsAndKeys:kAPP_KEY, @"appid", @"Ahmedabad", @"q", nil];
[[RKObjectManager sharedManager] getObjectsAtPath:@"/data/2.5/weather" parameters:queryParams success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
WeatherStatus *obj = [mappingResult.array objectAtIndex:0];
NSLog(@"info %@",obj.info);
NSLog(@"name %@",obj.name);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"What do you mean by 'there is no coffee?': %@", error);
}];
我得到
info (null)
name (null)
谁能告诉我哪里错了?
我已经看过了RestKit complex and simple JSON RKObjectMapping almost working, but
不要使用 description
作为 属性 名称,这只会给您带来麻烦。请改用 overview
或类似的东西。
在JSON中,天气是一个数组,所以你应该把你的天气(信息)属性设为NSArray
,并确保映射中的名称和属性 匹配。
我将 "WeatherStatus" class 中信息对象的 属性 更改为 NSArray。
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) NSArray *weather;
这里修改映射代码
RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[WeatherStatus class]];
[venueMapping addAttributeMappingsFromDictionary:@{@"name": @"name"}];
RKObjectMapping *locationMapping = [RKObjectMapping mappingForClass:[WeatherInfo class]];
[locationMapping addAttributeMappingsFromDictionary:@{@"description": @"description",@"icon":@"icon"}];
[venueMapping addRelationshipMappingWithSourceKeyPath:@"weather" mapping:locationMapping];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping method:RKRequestMethodGET pathPattern:nil keyPath:nil statusCodes:nil];
[objectManager addResponseDescriptor:responseDescriptor];
添加与 WeatherStatus 的关系映射 class。