ytpm
ytpm

Reputation: 5160

Can't map nested RestKit object

I have a problem, can't map a nested object of json. The problem is with the 'capacities' key.

This is the error:

restkit.object_mapping:RKMappingOperation.m:830 Did not find mappable relationship value keyPath 'capacities'

I know that the problem is with the mapping itself, but just can't figure what:

RKObjectMapping *capacityMapping = [RKObjectMapping mappingForClass:[Capacity class]];
[capacityMapping addAttributeMappingsFromDictionary:@{ @"capacityText" : @"capacityText",
                                                       @"priceDescriptionText" : @"priceDescriptionText",
                                                       @"priceText" : @"priceText" }];

RKObjectMapping *colorsMapping = [RKObjectMapping mappingForClass:[Colors class]];
[colorsMapping addAttributeMappingsFromDictionary:@{ @"ID" : @"idNum",
                                                     @"Name" : @"name",
                                                     @"colorHex" : @"colorHex",
                                                     @"imageUrl" : @"imageURL" }];

RKObjectMapping *deviceDataMapping = [RKObjectMapping mappingForClass:[DeviceData class]];
[deviceDataMapping addAttributeMappingsFromDictionary:@{ @"device.ID" : @"idNum",
                                                         @"device.Name" : @"name",
                                                         @"device.additionalFeatures" : @"additionalFeatures",
                                                         @"device.deviceName" : @"deviceName",
                                                         @"device.mainFeatures" : @"mainFeatures",
                                                         @"device.supportPagesLinks" : @"supportPagesLinks",
                                                         @"device.whatsInTheKit" : @"whatsInTheKit" }];

[deviceDataMapping addRelationshipMappingWithSourceKeyPath:@"capacities" mapping:capacityMapping];

[capacityMapping addRelationshipMappingWithSourceKeyPath:@"colors" mapping:colorsMapping];

[deviceDataMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"responseError"
                                                                                  toKeyPath:@"responseError"
                                                                                withMapping:errorMapping]];

[[RKObjectManager sharedManager] addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:deviceDataMapping
                                                                                                    method:RKRequestMethodGET
                                                                                               pathPattern:@"devices/:boneID"
                                                                                                   keyPath:nil
                                                                                               statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];

This is the DeviceData class:

@interface DeviceData : NSObject
@property (nonatomic) ResponseError *responseError;
@property (copy, nonatomic) NSString *idNum;
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *additionalFeatures;
@property (copy, nonatomic) NSString *deviceName;
@property (copy, nonatomic) NSString *mainFeatures;
@property (copy, nonatomic) NSString *supportPagesLinks;
@property (copy, nonatomic) NSString *whatsInTheKit;
@property (nonatomic) NSArray *capacities;
@property (assign, nonatomic) NSInteger boneID;
@end

This is the Capacity class:

@interface Capacity : NSObject
@property (copy, nonatomic) NSString *capacityText;
@property (nonatomic) NSArray *colors;
@property (copy, nonatomic) NSString *priceDescriptionText;
@property (copy, nonatomic) NSString *priceText;
@end

This is the Colors class:

@interface Colors : NSObject
@property (copy, nonatomic) NSString *idNum;
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *colorHex;
@property (copy, nonatomic) NSString *imageURL;
@end

This is the json:

{
  "responseError": null,
  "device": {
    "ID": null,
    "Name": null,
    "additionalFeatures": "additional features text",
    "capacities": [
      {
        "capacityText": "16GB",
        "colors": [
          {
            "ID": null,
            "Name": null,
            "colorHex": "#a68f76",
            "imageUrl": "iphone_5s_black.png"
          },
          {
            "ID": null,
            "Name": null,
            "colorHex": "#a9a9a9",
            "imageUrl": "iphone_5s_black.png"
          },
          {
            "ID": null,
            "Name": null,
            "colorHex": "#616065",
            "imageUrl": "iphone_5s_black.png"
          }
        ],
        "priceDescriptionText": “iPhone 5S",
        "priceText": "750$"
      },{
        "capacityText": “32GB",
        "colors": [
          {
            "ID": null,
            "Name": null,
            "colorHex": "#a68f76",
            "imageUrl": "iphone_5s_black.png"
          },
          {
            "ID": null,
            "Name": null,
            "colorHex": "#a9a9a9",
            "imageUrl": “iphone_5s_black.png"
          },
          {
            "ID": null,
            "Name": null,
            "colorHex": "#616065",
            "imageUrl": “iphone_5s_black.png"
          }
        ],
        "priceDescriptionText": “iPhone 5S",
        "priceText": "750$"
      }
    ],
    "deviceName": "iPhone 5s",
    "mainFeatures": “some main features text",
    "supportPagesLinks": [
      {
        "linkText": “restore",
        "linkUrl": “restore.pdf"
      }],
    "whatsInTheKit": "what inside the kit text"
  }
}

Upvotes: 1

Views: 972

Answers (1)

Wain
Wain

Reputation: 119041

Because your response descriptor has a nil key path and you use device.xxx in all source key paths of the deviceMapping you need to have an explicit relationship mapping so you can specify the source and destination key paths:

RKRelationshipMapping *capacitiesMapping = [RKRelationshipMapping relationshipMappingFromKeyPath:@"device.capacities" toKeyPath:@"capacities" withMapping:capacityMapping];
[deviceDataMapping addPropertyMapping:capacitiesMapping];

Upvotes: 5

Related Questions