2012-04-16 11 views
7

どのようにして、入れ子になったjsonをRestKit RKObjectMappingで下にマッピングできますか?私は "データ"をマップする必要があります。以下の私の現在のコードは(null)を返す - ありがとう!RestKit RKObjectMapping入れ子json

{ 

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

} 

クラス

@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

、https://github.com/RestKit/RestKit/wiki/Object-mappingをするとき、それを開始する素晴らしいリソースですRKオブジェクトのマッピングになります。 –

+0

簡単な質問、私はObjCの達人ではありませんが、NSStringのプロパティは 'コピー'する必要があると言われていますが、NSStringのプロパティはかなりの数のオープンソースプロジェクトやここに掲載されていますこの場合、「保持」を使用する理由は@steamboyですか? – powerj1984

答えて

6

あなたはrootKeyPathを逃すとまたプロバイダにマッピングを設定されています

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

はここにあなたに答えるための詳細情報です質問について他の要素(例えば「エラー」)になって:他人の利益のために

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

dataMapping = @ "data"を追加しました。私はこのエラーを受け取りました。「NSStringからの 'RKObjectMapping * _strong'に割り当てられている互換性のないポインタ型」 – steamboy

+0

私の誤字は残念です。あなたはdataMapping.rootKeyPathが必要です – shawnwall

+0

これはまだテストしましたか?私は自分のコードで何か似たようなことをするので、私はrootKeyPathが動作することを知っています。 – shawnwall

関連する問題