2014-02-01 5 views
2

Я struggeling немножко со следующими JSON Я пытаюсь отобразить в структуру объекта:Вложенный Отображение объектов с использованием RestKit

- Group 
    + label 
    + type 
    + children 
    - childname1 
     + label 
     + type 
     + value 

    - childname2 
     + label 
     + type 
     + value 

Я есть Group класс

@interface CameraGroup : NSObject 
@property (nonatomic, copy) NSString *label; 
@property (nonatomic, copy) NSString *type; 
@property (nonatomic, copy) NSDictionary *children; 
@end 

и Child класс

@property (nonatomic, copy) NSString *label; 
@property (nonatomic, copy) NSString *type; 
@property (nonatomic, copy) NSString *value; 

Моя JSON выглядит следующим образом:

{ 
    "actions": { 
     "label": "Action List", 
     "type": "section", 
     "children": { 
      "action1": { 
       "label": "This is action1", 
       "type": "toggle", 
       "value": 0 
      }, 
      "action2": { 
       "label": "This is action2", 
       "type": "range", 
       "value": 0 
      }, 
      "action3": { 
       "label": "This is action3", 
       "type": "toggle", 
       "value": 0 
      } 
     } 
    } 
} 

Я пытаюсь создать единый объект группы, содержащий NSDictionary (дети) с парами действий с ключом (например, action1 = ключ и дочерний объект метки, типа и значения) с помощью RestKit.

Я использую следующий фрагмент кода, но всегда в конечном итоге с Зингель, пустой объект ребенок:

RKObjectMapping *mappingChild = [RKObjectMapping mappingForClass:[Child class]]; 
    [mappingSetting addAttributeMappingsFromDictionary:@{ 
               @"label": @"label", 
               @"type": @"type", 
               @"value": @"value" 
               }]; 

    RKObjectMapping *mappingGroup = [RKObjectMapping mappingForClass:[Group class]]; 
    [mappingGroup addAttributeMappingsFromDictionary:@{ 
                 @"label": @"label", 
                 @"type": @"type" 
                 }]; 
    [mappingGroup addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"children" toKeyPath:@"children" withMapping:mappingSetting]]; 


    NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); 
    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mappingGroup method:RKRequestMethodAny pathPattern:@"/action" keyPath:@"actions" statusCodes:statusCodes]; 

    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.178.1:1337/actions"]]; 
    RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; 
    [operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) { 
    Group *group = [result firstObject]; 
    NSLog(@"Mapped the group: %@ of type %@ with children %i", article.label, article.label, [group.children count]); 
    } failure:^(RKObjectRequestOperation *operation, NSError *error) { 
    NSLog(@"Failed with error: %@", [error localizedDescription]); 
    }]; 
    [operation start]; 

Так есть ли способ, как Сопоставьте часть NSDictionary фактически не зная, что «действие1» назван " действие1" ??

ответ

4

После игры я нашел решение, которое, похоже, работает. responseDescriptor получает отображение Group, который имеет отношение отображения к dynamicMapping, который перебирает все ChildNodes и карты childMapping

RKObjectMapping *mappingChild = [RKObjectMapping mappingForClass:[Child class]]; 

    [mappingSetting addAttributeMappingsFromDictionary:@{ 
                 @"label" : @"label", 
                 @"type" : @"type", 
                 @"value" : @"value" 
                 }]; 

    RKDynamicMapping* dynamicMapping = [RKDynamicMapping new]; 
    [dynamicMapping setObjectMappingForRepresentationBlock:^RKObjectMapping *(id representation) { 

    NSArray *keys = [representation allKeys]; 

    RKObjectMapping *dataMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]]; 

    for (NSString *key in keys) { 
     [dataMapping addRelationshipMappingWithSourceKeyPath:key mapping:mappingChild]; 
    } 

    return dataMapping; 

    }]; 

    RKObjectMapping *mappingGroup = [RKObjectMapping mappingForClass:[Group class]]; 
    [Group addAttributeMappingsFromDictionary:@{ 
                @"label": @"label", 
                @"type": @"type" 
                }]; 

    [Group addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"children" toKeyPath:@"children" withMapping:dynamicMapping]]; 







    NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); 
    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mappingGroup 
                          method:RKRequestMethodAny 
                        pathPattern:@"/actions" 
                         keyPath:@"actions" 
                        statusCodes:statusCodes]; 
+0

Есть ли у вас какие-либо идеи, как это отображение может быть инвертированием? – reVerse

+0

нет, извините, но не было на эту тему, так как – Alx

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