Reputation: 5160
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
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