2015-04-22 5 views
0

Добрый день, все!Отображение вложенных объектов и массивов

Я пытаюсь выяснить, как сопоставлять объекты с вложенными массивами, но мой проект продолжает прерываться из-за неперехваченного исключения. Я предполагаю, что я не правильно что-то сопоставляю, но мне говорят, что что-то не соответствует кодированию ключевого значения.

Как сопоставить объект с вложенным массивом?

Ниже приведен пример JSON. Я пытаюсь отобразить, интерфейс и реализацию, а также ошибку, которая бросается соответственно. Наконец, есть ссылка на мой проект на GitHub, если я ничего не оставил, или увидеть, что полный источник будет полезен.

JSON

{ 
    "href": "string", 
    "items": [ 
    { 
     "type": "string", 
     "status": "string", 
     "name": "string", 
     "publisher": "string", 
     "publisherId": "string", 
     "description": "string", 
     "url": "string", 
     "smallLogoImageUrl": "string", 
     "tileImageUrl": "string", 
     "heroImageUrl": "string", 
     "tags": [ 
     "string", 
     "string" 
     ], 
     "createdOn": "2015-04-22T18:55:40.782Z", 
     "downloadUrl": "string", 
     "getProductCodeUrl": "string", 
     "metadata": { 
     "exeType": "string", 
     "packageFileName": "string", 
     "installDirectory": "string", 
     "executableName": "string" 
     }, 
     "id": "string" 
    } 
    ] 
} 

интерфейс (.h)

@interface SFrontPageItem : NSObject 

@property (nonatomic, strong) NSString *type; 
@property (nonatomic, strong) NSString *status; 
@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) NSString *publisher; 
@property (nonatomic, strong) NSString *publisherId; 
@property (nonatomic, strong) NSString *productDescription; 
@property (nonatomic, strong) NSString *url; 
@property (nonatomic, strong) NSString *smallLogoImageUrl; 
@property (nonatomic, strong) NSString *tileImageUrl; 
@property (nonatomic, strong) NSString *heroImageUrl; 
@property (nonatomic, strong) NSArray *tags; 
@property (nonatomic, strong) NSString *createdOn; 
@property (nonatomic, strong) NSString *downloadUrl; 
@property (nonatomic, strong) NSString *getProductCodeUrl; 
@property (nonatomic, strong) NSArray *metadata; 
@property (nonatomic, strong) NSString *productID; 

@end 


@interface SFrontPage : NSObject 

@property (nonatomic, strong) NSString *href; 
@property (nonatomic, strong) NSArray *items; 

@end 

реализации (.m)

- (void) getFrontPage 
{ 

    AppDelegate *appDelegate = [[NSApplication sharedApplication] delegate]; 

    RKObjectMapping *itemMapping = [RKObjectMapping mappingForClass:[SFrontPageItem class]]; 

    [itemMapping addAttributeMappingsFromDictionary:@{ 
                 @"type": @"type", 
                 @"status": @"status", 
                 @"name": @"name", 
                 @"publisher": @"publisher", 
                 //@"publisherId": @"publisherId", 
                 @"description": @"description", 
                 @"url": @"url", 
                 //@"smallLogoImageUrl": @"smallLogoImageUrl", 
                 @"tileImageUrl": @"tileImageUrl", 
                 //@"heroImageUrl": @"heroImageUrl", 
                 //@"tags": @"tags", 
                 @"createdOn": @"createdOn", 
                 //@"downloadUrl": @"downloadUrl", 
                 //@"getProductCodeUrl": @"getProductCodeUrl", 
                 //@"metadata": @"metadata", 
                 @"id": @"productID" 
                }]; 
    //itemMapping.forceCollectionMapping = YES; 


    RKObjectMapping *frontpageMapping = [RKObjectMapping mappingForClass:[SFrontPage class]]; 
    [frontpageMapping addAttributeMappingsFromDictionary:@{ 
                  @"href": @"href" 
                 }]; 


    [frontpageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"items" 
                        toKeyPath:@"items" 
                        withMapping:itemMapping]]; 


    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:frontpageMapping 
                          method:RKRequestMethodGET 
                         pathPattern:nil 
                          keyPath:nil 
                         statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; 

    [self.objectManager.HTTPClient setAuthorizationHeaderWithUsername:self.sconnection.apiKey.key password:self.sconnection.apiKey.secret]; 
    [self.objectManager addResponseDescriptor:responseDescriptor]; 
    [self.objectManager getObjectsAtPath:@"/api/frontpage/rest" parameters:nil 
     success:^(RKObjectRequestOperation *operation, RKMappingResult *result) 
     { 

      SFrontPage *newFrontpage = result.firstObject; 
      NSLog (@" HREF: %@", newFrontpage.href); 

      //NSLog (@"ITEMS: %@", newFrontpage.items.firstObject); 
      //SFrontPageItem *newFrontpageItem = newFrontpage.items.firstObject; 
      //NSLog (@"Unexpected Great Thing %@", newFrontpageItem); 

      [appDelegate.loginViewController apiConnectionSuccess]; 


     } failure:^(RKObjectRequestOperation *operation, NSError *error) 
     { 

      [appDelegate.loginViewController updateLoginWindowHeaderLabelTo:@"Unable to Load Frontpage"]; 
      [appDelegate.loginViewController apiConnectionFailure]; 
     }]; 
} 

Ошибка

[<SFrontPageItem 0x6180001026d0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key description. 

Источник

Полный источник можно найти on GitHub, с соответствующими файлами будучи APIManager.h & APIManager.m.

Надеюсь, что я был достаточно ясен, я иногда пропускаю отметку при формировании вопроса о чем-то, что я не совсем понимаю. Я новичок в ObjC и RestKit, поэтому я уверен, что в моем коде уже много запутанных вещей. Спасибо, что нашли время, чтобы прочитать его, и рассмотрите мой вопрос. Если я смогу прояснить что-нибудь, пожалуйста, дайте мне знать!

Michael

ответ

1

Вы карту от description к description, но свойство имеет идентификатор productDescription. Измените отображение или имя свойства.

+0

Я этого не понимал, спасибо! Я немного ошеломлен, что это была целая проблема. Идет, чтобы показать, насколько важна двойная проверка этих вещей. Я приму свой ответ, как только это позволит. –

+1

Об этих ошибках можно провести свое время. Я получил сообщение об ошибке, в котором говорится, что он не может найти 'описание'. Ну, и я тоже. ;-) –

1

Попробуйте использовать некоторые готовые решения. https://github.com/aryaxt/OCMapper https://github.com/isair/JSONHelper

+0

Благодарим за предложение @Gal! RestKit, похоже, сделан для сопоставления объектов, и я бы хотел избежать использования слишком большого количества сторонних расширений. Если возможно, я бы предпочел найти решение для RestKit, но если я не смогу заставить работать, я рассмотрю проекты, о которых вы упомянули. Благодаря! –

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