0

次の形式で投稿リクエストを受け入れる JSON エンド パスがあります。

  {'values': [
    {
     "date":<measurement date as Unix time stamp>
     "value":<weight>
    }
    {
     "date":<measurement date as Unix time stamp>
     "value":<weight>
    }
     ...]}

「Values」はクラス「EntryCollection」で表され、各値はクラス「Entry」で表されます。オブジェクトを JSON 表現にマップする正しい方法を見つけるのに困惑しています。現在、エラーの原因となる次のコードがあります:「マッピング操作は、検索されたキーパスでネストされたオブジェクト表現を見つけることができませんでした」。

RKObjectMapping *entryMapping = [RKObjectMapping requestMapping];

RKObjectMapping *valuesMapping = [RKObjectMapping mappingForClass:[EntriesCollection class]];
[valuesMapping addAttributeMappingsFromDictionary:[EntryCollection attributesMapping]];

[singleEntryMapping addAttributeMappingsFromDictionary:[SingleEntry attributesMapping]];
[singleEntryMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"entries" toKeyPath:@"entries" withMapping:valuesMapping]];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:entryMapping
                                                                               objectClass:mappedClass
                                                                               rootKeyPath:nil];

[self.objectManager addRequestDescriptor:requestDescriptor];
NSString *path = [self pathForPOST];

[self.objectManager postObject:weights path:path parameters:nil success:nil failure:nil];

データ構造の編集

私のデータ構造は単純です(私はそう思います):

EntryCollection  
- NSArray *entries (a collection of objects of type Entry)

Entry  
- NSDate *date  
- NSNumber *weight;

エントリで満たされた EntryCollection を POST したいと思います。EntryCollection のマッピングは「エントリ -> 値」であり、Entry のマッピングは「日付 -> 日付、重み -> 値」です。

4

3 に答える 3

1

マッピングに問題がある場合は、モデルとクラスとマッピングを表示するRKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);か、コードのどこかに配置して出力を確認する必要があります。

別の方法として、エンティティ構造がサーバーに投稿したいものと異なる場合は、組み込みAFNetworkingクライアントを使用して簡単なリクエストを行うことができます。

 [[RKObjectManager sharedManager].HTTPClient postPath:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"WHOOO");

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        //
    }];
于 2013-07-07T02:41:02.410 に答える
0

私は解決策を見つけました。結局のところ、JSON で暗示された階層を記述するには、関係マッピングが必要でした。値のエンティティごとにタイプがないため、「空の」マッピングを作成し、それに関係マッピングを追加しました。また、正しい MIMEType を設定し、クラスの属性マッピングを逆にすることも忘れていました。それを理解するには、レストキットで数日が必要だと思います。

RKObjectMapping *entryMapping = [RKObjectMapping requestMapping];
        [entryMapping addAttributeMappingsFromDictionary:[SingleEntry attributesMapping]];
        RKObjectMapping *entrySerializedMapping = [entryMapping inverseMapping];

    RKRelationshipMapping *entryRelationship = [RKRelationshipMapping relationshipMappingFromKeyPath:@"entries" toKeyPath:@"values" withMapping:entrySerializedMapping];

    RKObjectMapping *valueMapping = [RKObjectMapping requestMapping];

    [valueMapping addPropertyMapping:valueMapping];

    RKRequestDescriptor *descriptor = [RKRequestDescriptor requestDescriptorWithMapping:valueMapping objectClass:[EntriesCollection class] rootKeyPath:nil];

    [self.objectManager addRequestDescriptor:descriptor];
    self.objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

    NSString *path = [self pathForPOST];

    [self.objectManager postObject:entryCollection path:path parameters:nil success:nil failure:nil];
于 2013-07-07T22:15:22.567 に答える