2012-04-16 18 views
7

¿Cómo puedo mapear el json anidado a continuación con RestKit RKObjectMapping? Solo necesito mapear los "datos". Mi código actual a continuación regresa (nulo) - ¡Gracias!RestKit RKObjectMapping json anidado

{ 

    "sucess": true, 
    "error": { 
     "code": "", 
     "message": "" 
    }, 
    "data": [ 
     { 
      "id": 1, 
      "name": "Salad", 
      "description": "Salad Desc", 
      "category_id": 1 
     }, 
     { 
      "id": 2, 
      "name": "Soup", 
      "description": "Soup Desc", 
      "category_id": 1 
     }, 
     { 
      "id": 3, 
      "name": "Wrap", 
      "description": "Wrap Desc", 
      "category_id": 1 
     }, 
     { 
      "id": 4, 
      "name": "Appetizers", 
      "description": "Appetizers Desc", 
      "category_id": 1 
     } 
    ] 

} 

Clase

@interface Subcategory : NSObject  
    @property (nonatomic, retain) NSNumber *subcategoryID; 
    @property (nonatomic, retain) NSNumber *categoryID; 
    @property (nonatomic, retain) NSString *name; 
    @property (nonatomic, retain) NSString *description; 
    @property (nonatomic, retain) NSString *thumbnail; 
    @property (nonatomic, retain) NSArray *data; 

ViewController

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Subcategory class]]; 

RKObjectMapping* dataMapping = [RKObjectMapping mappingForClass:[Subcategory class]]; 
[dataMapping mapKeyPath:@"id" toAttribute:@"subcategoryID"]; 
[dataMapping mapKeyPath:@"category_id" toAttribute:@"categoryID"]; 
[dataMapping mapAttributes:@"name", @"description", nil]; 

[mapping mapKeyPath:@"data" toRelationship:@"data" withMapping:dataMapping]; 

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[NSString stringWith 
+0

Para beneficio de los demás, https://github.com/RestKit/RestKit/wiki/Object-mapping es un gran recurso para empezar, cuando se viene al mapeo de objetos RK. –

+0

Pregunta rápida, no soy un gurú de ObjC pero me han dicho que las propiedades de NSString deberían ser 'copiar' no 'retener', pero veo las propiedades de NSString retenidas en bastantes proyectos de código abierto y publicaciones aquí. una razón @steamboy para usar 'retener' en este caso? – powerj1984

Respuesta

6

Te estas perdiendo el rootKeyPath y ajuste de la proyección en el proveedor:

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Subcategory class]];  
RKObjectMapping* dataMapping = [RKObjectMapping mappingForClass:[Subcategory class]]; 
[dataMapping mapKeyPath:@"id" toAttribute:@"subcategoryID"]; 
[dataMapping mapKeyPath:@"category_id" toAttribute:@"categoryID"]; 
[dataMapping mapAttributes:@"name", @"description", nil]; 
dataMapping.rootKeyPath = @"data"; //this is what you were missing  
//get your mapping provider (i'm not sure if you already have on declared) 
[mappingProvider setObjectMapping:dataMapping forResourcePathPattern:@"/somepath/toservice/"]; 
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"/somepath/toservice/"]; 

Aquí hay más información para responder a su pregunta sobre llegar a los otros elementos (por ejemplo, 'error'):

- (void)objectLoader:(RKObjectLoader *)objectLoader didFailWithError:(NSError *)error { 
    NSError *parseError = nil; 
    id response = [objectLoader.response parsedBody:&parseError]; 
    DLog(@"response %@", response);  
    if (!parseError) { 
     NSString *errorMessage = [[response valueForKey:@"error"] valueForKey:@"message"];  
     //do something with it  
    } 
} 
+0

Agregué el mapeo de datos = @ "datos"; y recibo este error "Tipos de punteros incompatibles que asignan a 'RKObjectMapping * _strong' de NSString" – steamboy

+0

así que lo siento por mi error tipográfico. Necesita dataMapping.rootKeyPath – shawnwall

+0

¿Ya ha probado esto? Hago algo similar en mi propio código, así que sé que el rootkeypath funciona. – shawnwall

Cuestiones relacionadas