OStack程序员社区-中国程序员成长平台

标题: ios - 使用 RestKit 的嵌套对象映射 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 06:14
标题: ios - 使用 RestKit 的嵌套对象映射

我在尝试将 JSON 映射到对象结构中时遇到了一些困难:

- 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
            }
        }
    }
}

我试图以单个组对象结束,使用 RestKit 持有一个带有键值对操作的 NSDictionary(子对象)(例如 action1 = 标签、类型和值的键和子对象)。

我正在使用以下代码段,但总是以一个单一的空子对象结束:

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];

那么有什么方法可以在不知道“action1”被命名为“action1”的情况下映射 NSDictionary 部分??



Best Answer-推荐答案


在玩了之后,我找到了一个似乎可行的解决方案。 responseDescriptor获取Group的映射,它有一个关系映射到一个dynamicMapping,它遍历所有子节点并映射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];

关于ios - 使用 RestKit 的嵌套对象映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504273/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4