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。EntryCollection 的映射是“entries -> values”,Entry 的映射是“date -> date, weight -> value”。

4

3 回答 3

1

在任何情况下,您的 JSON 请求负载必须确认以下数据结构:

NSArray

   |
   |______NSDictionary ->Key: Date Value: weight
   |                   ->Key: value Value: weight
   |
   |______NSDictionary ->Key: Date Value: weight
   |                   ->Key: value Value: weight
   |
   |______NSDictionary ->Key: Date Value: weight
                       ->Key: value Value: weight

两者都NSArray与数据格式NSDictionary完全兼容。JSON我不知道你的底层对象结构,但最终这个数组应该作为 request payload 发布NSData,你就完成了。

于 2013-07-05T16:25:09.140 回答
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 并反转我的类的属性映射。我想需要几天的 restkit 才能掌握它。

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 回答