How to parse this repsonse in restkit? - ios

I am confused completely to parse this kind of response in restkit. I am using this link but i am not able to understand how to parse this response.Any help would be appreciated.
“groups”: {
"group1": [
{
"email": "blake#restkit.org",
"favorite_animal": "Monkey"
},
{
"email": "slake#restkit.org",
"favorite_animal": "Donkey"
}
],
"group2": [
{
"email": "sarah#restkit.org",
"favorite_animal": "Cat"
},
{
"email": "varah#restkit.org",
"favorite_animal": "Cow"
}
]
}
I am Using Below mapping.
#interface GroupResponse : NSObject
#property (nonatomic, strong) NSArray *Groups;
+ (RKObjectMapping *)mapping;
#end
#implementation GroupResponse
+ (RKObjectMapping *)mapping {
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[self class]];
[objectMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#“groups” toKeyPath:#“Groups” withMapping:[GroupData mapping]]];
return objectMapping;
}
#end
#interface GroupData : NSObject
#property (nonatomic, strong) NSString *groupName;
#property (nonatomic, strong) NSString *arrPersons;
+ (RKObjectMapping *)mapping;
#end
#implementation GroupData
+ (RKObjectMapping *)mapping {
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[self class]];
objectMapping.forceCollectionMapping = YES;
[objectMapping addAttributeMappingFromKeyOfRepresentationToAttribute:#"groupName"];
[objectMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#“(groupName)” toKeyPath:#"arrPersons" withMapping:[Person mapping]]];
return objectMapping;
}
#end
#interface Person : NSObject
#property (nonatomic, strong) NSString *email;
#property (nonatomic, strong) NSString *favAnimal;
+ (RKObjectMapping *) mapping;
#end
#implementation Person
+ (RKObjectMapping *)mapping {
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[self class]];
[objectMapping addAttributeMappingsFromDictionary:#{#"email" : #"email",
#"favorite_animal" : #"favAnimal"}];
return objectMapping;
}
#end
Everytime arrPersons is nil. How to do proper mapping in this case.

This attribute:
#property (nonatomic, strong) NSString *arrPersons;
should actually be a mutable array, not a string type:
#property (nonatomic, strong) NSMutableArray *arrPersons;
because the nested JSON array can't be converted into a string and your mapping indicates that it should be processed into an array of Person objects.

Related

RestKit RKRelationshipMapping doesn't working

Here is my JSON
{
"pages": 8,
"salads": [
{
"id": "392",
"img": "http://salatiki.com.ua/images/mini/20120114_285.jpg",
"ingredCount": 5,
"ingredients": "картофель, свекла, салат, яйцо, сливки",
"name": "Шведский картофельный",
"rating": 4
},
.......
]
}
I got "pages", but my "salads" is nil (see log).
My NSManagedObjects
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#class SSaladsBody;
#interface SSaladPage : NSManagedObject
#property (nonatomic, retain) NSNumber * sPages;
#property (nonatomic, retain) SSaladsBody *salads;
#end
for key "salads"
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#interface SSaladsBody : NSManagedObject
#property (nonatomic, retain) NSNumber * sId;
#property (nonatomic, retain) NSString * sImage;
#property (nonatomic, retain) NSString * sName;
#property (nonatomic, retain) NSNumber * sRating;
#property (nonatomic, retain) NSString * sIngredients;
#property (nonatomic, retain) NSNumber * sIngredientsCount;
#end
in my add delegate
RKEntityMapping *saladPageMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([SSaladPage class]) inManagedObjectStore:managedObjectStore];
[saladPageMapping addAttributeMappingsFromDictionary:#{ #"pages" : #"sPages", }];
saladPageMapping.identificationAttributes = #[#"sPages"];
RKEntityMapping *saladsBodyMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([SSaladsBody class]) inManagedObjectStore:managedObjectStore];
[saladsBodyMapping addAttributeMappingsFromDictionary:#{ #"id" : #"sId",
#"img" : #"sImage",
#"name" : #"sName",
#"rating" : #"sRating",
#"ingredients" : #"sIngredients",
#"ingredCount" : #"sIngredientsCount" }];
saladsBodyMapping.identificationAttributes = #[#"sId"];
[saladPageMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#"salads"
toKeyPath:#"salads"
withMapping:saladsBodyMapping]];
RKResponseDescriptor *saladPageDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:saladPageMapping
method:RKRequestMethodGET
pathPattern:nil
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[manager addResponseDescriptorsFromArray: #[saladPageDescriptor]];
[[RKObjectManager sharedManager] getObjectsAtPath:#"api/get.php?getByCat=1&page=1" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(#"Mapping salads OK! %#", mappingResult.array);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(#"Error: %#",error);
}];
and log
2014-11-04 23:57:49.641 Salatiki[10213:f03] I restkit.network:RKObjectRequestOperation.m:250 GET 'http://salatiki.com.ua/api/get.php?getByCat=1&page=1' (200 OK / 1 objects) [request=0.0989s mapping=0.0117s total=0.1613s]
2014-11-04 23:57:49.641 Salatiki[10213:607] Mapping salads OK! (
"<SSaladPage: 0x7b03b970> (entity: SSaladPage; id: 0x7b267d90 <x-coredata://8CC2FD2A-9D05-4863-99AA-30B318EEC57C/SSaladPage/p42> ; data: {\n sPages = 8;\n salads = nil;\n})"
)
what i'm doing wrong? I try to add one more responseDeskriptor, for "salads" it work's but he put array in to main {}; not to "salads" = []; Thank you.
The property
#property (nonatomic, retain) SSaladsBody *salads;
should actually be a relationship, so it should be NSSet, not SSaladsBody.
Other than that, things look ok. If you still have issues you should turn on trace logging and see what processing is done around the relationship contents.

RestKit RKObjectMapping error, update from 0.10 to 0.20

I'm updating RestKit from 0.10 to 0.20 and getting some errors I'm trying to figure out.
I'm getting errors on the Spring.m file for the MappingForClass:usingBlock, no #interface for mapKeyPathsToAttributes, and no #interface for hasMany:withMapping.
Can't seem to figure this out myself.
Spring.h
#interface Spring : NSObject
#property (nonatomic, strong) NSString *name;
#property (nonatomic, strong) NSNumber *id;
#property (nonatomic, strong) NSArray *leafs;
+ (RKObjectMapping *)mapping;
#end
Spring.m
#implementation Spring
// Creating RestKit object mapping variable, THIS IS WHERE ERRORS OCCUR
+ (RKObjectMapping *)mapping {
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[self class] usingBlock:^(RKObjectMapping *mapping) {
[mapping mapKeyPathsToAttributes:
#"name", #"name",
#"id", #"id",
nil];
[mapping hasMany:#"leafs" withMapping:[Leaf mapping]];
}];
return objectMapping;
}
#end
I'm using https://github.com/RestKit/RestKit/wiki/Upgrading-from-v0.10.x-to-v0.20.0 to help me try to figure this out.
Answer: Needed to use RKRequestDescriptor

Nested Array mapping restkit v.20

i wanna to map object in Google Places Api Photos
"photos" : [
{
"height" : 1224,
"html_attributions" : [
"\u003ca href=\"https://plus.google.com/105663944571530352563\"\u003eJoshua Gilmore\u003c/a\u003e"
],
"photo_reference" : "CnRoAAAAzuH4E1LVJHMdXNYbewoxcPE-qHizCE6pmOGjckeaCTKSL7xGVzLuwGxu7kx44bCWIZinMx4jkd8eenALB7w7jNRFrzE3hip2ld7096SI9D4sE2WpXQ1QH-iTQm7qhx4i6QSGGeXKjA9SfT4N6krwzRIQr1mulgyuKHP-2s_TJWIahhoUgxfccds3VAH2bj_CIQYzbAQZRhc",
"width" : 1632
}
],
i try with this code but photos is still nil
Place Class
#interface Place : NSObject
#property (nonatomic,strong) Geometry * geometry;
#property (nonatomic,strong) NSString * icon;
#property (nonatomic,strong) NSString * placeID;
#property (nonatomic,strong) NSString * name;
#property (nonatomic,strong) OpeningHours * opening_hours;
#property (nonatomic,strong) NSString * price_level;
#property (nonatomic,strong) NSString * rating;
#property (nonatomic,strong) NSString * vicinity;
#property (nonatomic,strong) NSArray *photos;
#property (nonatomic,strong) NSString *reference;
#end
Photos Class
#import <Foundation/Foundation.h>
#interface Photos : NSObject
#property (nonatomic,strong) NSNumber *height;
#property (nonatomic,strong) NSString *html_attributions;
#property (nonatomic,strong) NSString *photo_reference;
#property (nonatomic,strong) NSNumber *width;
#end
And i map with:
RKObjectMapping *placeMapping = [RKObjectMapping mappingForClass:[Place class]];
[placeMapping addAttributeMappingsFromDictionary:#{
#"icon" : #"icon",
#"id" : #"placeID",
#"name" : #"name",
#"reference" : #"reference",
#"price_level" : #"price_level",
#"rating" : #"rating",
#"vicinity" : #"vicinity",
}];
RKObjectMapping* photosMapping = [RKObjectMapping mappingForClass:[Photos class]];
[photosMapping addAttributeMappingsFromArray:#[#"height",#"photo_reference",#"html_attributions",#"width"]];
[placeMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#"photos"
toKeyPath:#"photos"
withMapping:photosMapping]];
I don't know how to map photos as array in Place Class .
Any one can help me ?

RestKit not mapping Images from JSON

I'm not able to map the Images from my JSON response correctly, and I can't figure out why.
Here is error: "W restkit.object_mapping:RKObjectMappingOperation.m:244 Failed transformation of value at keyPath 'images'. No strategy for transforming from '__NSArrayM' to 'Images'"
Here is JSON:
{
"timestamp": "2013-05-10T03:09:39Z",
"feed": [{
"headline": "Head text",
"links": {
"api": {
"news": {
"href": "http://api.website.com/v1/91"
},
"self": {
"href": "http://api.website.com/v1/91"
}
},
"web": {
"href": "http://website.com/the/story"
},
"mobile": {
"href": "http://m.website.com/wireless/story?storyId=9254113"
}
},
"source": "Associated Press",
"description": "Description text.",
"images": [{
"height": 324,
"alt": "",
"width": 576,
"name": "Name text",
"caption": "Caption text.",
"url": "http://a.website.com/media/2013/0508.jpg"
}],
Feed.h
#property (nonatomic, strong) Links *links;
#property (nonatomic, strong) Images *images;
#property (nonatomic, strong) Video *video;
#property (nonatomic, strong) NSString *headline;
#property (nonatomic, strong) NSString *source;
#property (nonatomic, strong) NSDate *published;
#property (nonatomic, strong) NSString *description;
#property (nonatomic, strong) NSString *premium;
+ (RKObjectMapping *) mapping;
Feed.m
+ (RKObjectMapping *)mapping {
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[self class] usingBlock:^(RKObjectMapping *mapping) {
[mapping mapKeyPathsToAttributes:
#"headline", #"headline",
#"source", #"source",
#"published", #"published",
#"description", #"description",
#"premium", #"premium",
nil];
[mapping hasOne:#"links" withMapping:[Links mapping]];
[mapping hasOne:#"images" withMapping:[Images mapping]];
//[mapping hasMany:#"images" withMapping:[Images mapping]];
[mapping hasOne:#"video" withMapping:[Video mapping]];
}];
return objectMapping;
}
Images.h
#property (nonatomic, strong) NSNumber *height;
#property (nonatomic, strong) NSNumber *width;
#property (nonatomic, strong) NSString *caption;
#property (nonatomic, strong) NSURL *url;
+ (RKObjectMapping *) mapping;
Images.m
+ (RKObjectMapping *)mapping {
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[self class] usingBlock:^(RKObjectMapping *mapping) {
[mapping mapKeyPathsToAttributes:
#"height", #"height",
#"width", #"width",
#"caption", #"caption",
#"url", #"url",
nil];
}];
return objectMapping;
}
Everything else is mapping correctly except images. I don't know if it has to do with it being an Array but it only having one result, so its not necessarily an array? And if its not, then how I would write that... I'm just not totally clear on why its not mapping.
As you can see I tried both hasMany: and hasOne: mapping and neither worked, I got the same error.
I tried using NSLog(#"url image: %#", feedLocal.images.url);' but get(null). Even though I thought it would work becauseNSLog(#"href web: %#", feedLocal.links.web.href);` works perfectly for my links href.
Any help would be greatly appreciated, thanks so much!
In Feed.h you need to change your images property to be:
#property (nonatomic, strong) NSArray *images;
And you should set the mapping to hasMany:.

RestKit Entity mapping

Hi can someone teach me how to do nested Restkit Entity Mapping? i keep get error message while debug, below are my error message and code
[__NSSetM insertObject:atIndex:]: unrecognized selector sent to instance 0x95269d0
Json data
Family =(
{
id = "1";
parentName = "Mr John";
Child =(
{
parentID = "1";
childName = "James";
age = "18";
},
{
parentID = "1";
childName = "ruby";
age = "19";
},
{
parentID = "1";
childName = "ella";
age = "20";
}
);
}
);
My AppDelegate.m
RKEntityMapping *familyMapping = [RKEntityMapping mappingForEntityForName:#"Family" inManagedObjectStore:managedObjectStore];
debtorMapping.identificationAttributes = #[ #"id" ];
[familyMapping addAttributeMappingsFromDictionary:#{
#"id": #"accNo",
#"parentName": #"companyName"
}];
RKEntityMapping *childMapping = [RKEntityMapping mappingForEntityForName:#"Child" inManagedObjectStore:managedObjectStore];
childMapping.identificationAttributes = #[ #"parentID"];
[childMapping addAttributeMappingsFromDictionary:#{
#"parentID": #"parentID",
#"childName": #"childName",
#"age": #"age"
}];
[familyMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#"Child" toKeyPath:#"Child" withMapping:childMapping]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:familyMapping
pathPattern:nil
keyPath:#"Family"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptor:responseDescriptor];
Family NSManagedObject
#class Child;
#interface Family : NSManagedObject
#property (nonatomic, retain) NSString * id;
#property (nonatomic, retain) NSString * parentName;
#property (nonatomic, retain) NSSet *child;
#end
#interface Family (CoreDataGeneratedAccessors)
- (void)addChildObject:(Child *)value;
- (void)removeChildObject:(Child *)value;
- (void)addChild:(NSSet *)values;
- (void)removeChild:(NSSet *)values;
#end
Child NSManageObject
#class Family;
#interface Child : NSManagedObject
#property (nonatomic, retain) NSString * parentID;
#property (nonatomic, retain) NSString * childName;
#property (nonatomic, retain) NSString * age;
#property (nonatomic, retain) Family *family;
#end
i found out my mistake already.
[familyMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#"Child" toKeyPath:#"child" withMapping:childMapping]];
the toKeyPath string should assign with small letter. "follow core data relationship string".

Resources