2012-04-16 34 views
7

Làm thế nào tôi có thể ánh xạ json lồng nhau bên dưới với RestKit RKObjectMapping? Tôi chỉ cần ánh xạ "dữ liệu". Mã hiện tại của tôi dưới đây trả về (null) - Cảm ơn!RestKit RKObject Lập bản đồ james lồng nhau

{ 

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

} 

Lớp

@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

Vì lợi ích của người khác, https://github.com/RestKit/RestKit/wiki/Object-mapping là một nguồn lực tuyệt vời để bắt đầu khi nó đến bản đồ đối tượng RK. –

+0

Câu hỏi nhanh, tôi không phải là một chuyên gia về ObjC nhưng tôi đã nói rằng các thuộc tính NSString phải là 'copy' không 'giữ lại', nhưng tôi thấy các thuộc tính NSString được giữ lại trong một vài dự án nguồn mở và các bài viết trên đây - có một lý do @steamboy để sử dụng 'giữ lại' trong trường hợp này? – powerj1984

Trả lời

6

Bạn đang thiếu rootKeyPath và cũng thiết lập các bản đồ trong các nhà cung cấp:

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

Dưới đây là thông tin hơn để trả lời của bạn câu hỏi về chuyển đến các yếu tố khác (ví dụ: 'lỗi'):

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

Tôi đã thêm dataMapping = @ "data"; và tôi nhận được lỗi này "Các loại con trỏ không tương thích gán cho 'RKObjectMapping * _strong' từ NSString" – steamboy

+0

vì vậy xin lỗi vì lỗi đánh máy của tôi. Bạn cần dataMapping.rootKeyPath – shawnwall

+0

Bạn đã thử nghiệm tính năng này chưa? Tôi làm một cái gì đó tương tự trong mã của riêng tôi vì vậy tôi biết rootKeyPath hoạt động. – shawnwall

Các vấn đề liên quan