2013-07-05 31 views
0

我有一個JSON結束路徑接受以下格式的發佈請求。POST與休息套件

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

「值」由類「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」。

+0

您的類結構真的不清楚,因爲您的映射中有許多不同的類,並且大部分映射看起來都是部分的。你可能會發現創建映射就像你解析JSON然後反過來一樣簡單。否則,您需要顯示完整的課程結構。 – Wain

+0

我用數據結構更新了我的問題。 – ff10

回答

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

兩個NSArrayNSDictionaryJSON數據格式完全兼容。我不知道你的底層對象結構,但最終這個數組應該發佈爲請求有效載荷NSData,你就完成了。

+0

我們能得到的JSON字典爲根,這不符合映射問題幫助以任何方式...... – Wain

1

好吧,如果你在映射時遇到問題,那麼你要麼顯示你的模型,類和映射,要麼在你的代碼中放置RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace);,讓我們看看輸出。

作爲替代方案,如果你的實體結構從你想要發佈到服務器什麼變化,你可以使用嵌入式AFNetworking客戶,做一個簡單的請求。

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

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     // 
    }]; 
+0

我已經更新我的數據結構的問題。 – ff10