2016-10-01 3 views
0
{"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.Отображение RestKit с объектами NSDictionary и NSArray

Теперь я хочу сопоставить «погоду» и «имя» и захотеть тот же объект, что и ответ.

я могу создать для класса

@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

ответ

0

Я изменяю свойство информационного объекта в классе «WeatherStatus» в 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.

Кредит идет https://stackoverflow.com/users/1988185/wain

1

Не используйте description в качестве имени свойства, это будет только вызвать проблемы. Используйте overview или что-то подобное вместо этого.

В JSON погода представляет собой массив, поэтому вы должны сделать свой объект погоды (info) NSArray и быть уверенным, что имя соответствует сопоставлению и свойствам.

+0

У меня путают. в http://stackoverflow.com/questions/23529494/restkit-complex-and-simple-json-rkobjectmapping-almost-working-but «location» находится в формате массива! – kb920

+0

Это массив верхнего уровня, а не вложенный. Это ключевое различие. – Wain

+0

Я пробовал описать как массив, но это не сработало! – kb920

Смежные вопросы