2

次の形式で JSON を返す Web サービスがあります。

{
"client": {
         "firstName": "Aaron"
         },
"error": {
         "code":""
         }
}

そして、レストキットでマッピングを設定しています。次のエラーが発生し続けます。

Error Domain=org.restkit.RestKit.ErrorDomain Code=1001 "Could not find an object mapping for keyPath: ''" UserInfo=0x5961f0 {=RKObjectMapperKeyPath, NSLocalizedDescription=Could not find an object mapping for keyPath: ''}

マッピングを設定する方法は次のとおりです。

    [[RKObjectManager sharedManager].mappingProvider setMapping:[Client objectMapping] forKeyPath:@"client"];
    [[RKObjectManager sharedManager].mappingProvider setMapping:[ErrorObject objectMapping] forKeyPath:@"error"];

クライアント マッピング:

+(RKObjectMapping*) objectMapping {
   RKObjectMapping* responseObjectMapping = [RKObjectMapping mappingForClass:[Client class]];
   [responseObjectMapping setRootKeyPath:@"client"];
   [responseObjectMapping mapKeyPathsToAttributes:
    @"firstName", @"firstName",
    nil];
   return responseObjectMapping;
}

エラー マッピング:

+(RKObjectMapping*) objectMapping {
   RKObjectMapping* responseObjectMapping = [RKObjectMapping mappingForClass:[ErrorObject class]];
   [responseObjectMapping setRootKeyPath:@"error"];
   [responseObjectMapping mapKeyPathsToAttributes:
    @"code", @"code",
    nil];
   return responseObjectMapping;
}

そして、次のようにサービスを呼び出します。

//Send initial load request
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/getdetails" stringByAppendingQueryParameters:params] usingBlock:^(RKObjectLoader *loader) {
    loader.delegate = self;
    loader.userData = INITIAL_LOAD_REQUEST;
}];

編集:

以下のアドバイスに従って問題を解決し、マッピングを init メソッドから次のようにオブジェクトローダーブロックに設定するように移動しました。

    //Send initial load request
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:[@"/getdetails" stringByAppendingQueryParameters:params] usingBlock:^(RKObjectLoader *loader) {
    loader.delegate = self;

    //set mapping explicitly
    RKObjectMappingProvider *provider = [[RKObjectMappingProvider alloc] init];
    [provider setMapping:[Clien objectMapping] forKeyPath:@"client"];
    [provider setMapping:[ErrorObject objectMapping] forKeyPath:@"error"];
    [loader setMappingProvider:provider];

    loader.userData = INITIAL_LOAD_REQUEST;
}];
4

1 に答える 1

2

行を削除します

[responseObjectMapping setRootKeyPath:@"client"];

[responseObjectMapping setRootKeyPath:@"error"];
于 2012-08-14T13:02:41.207 に答える