2011-11-17 102 views
4

我有一個JSON看起來像這樣的位置:RestKit任意鍵對象映射

{ 
    "key1":[ 
    { 
    "desc":"key1decs.", 
    "duration":50; 
    },{ 
    "desc":"", 
    "duration":90; 
    },{ 
    "desc":"Kurz vor...", 
    "duration":30; 
    } 
], 
"key2":[ 
    { 
    "desc":"key2decs.", 
    "duration":50; 
    },{ 
    "desc":"blabla", 
    "duration":90; 
    } 
] 
} 

我試圖做一個映射。但我因爲不同的/不同的密鑰而被卡住了。我試圖沒有KVC的映射,但似乎不是 正在工作。給我的錯誤: 失敗的keyPath'key1.desc'處的值轉換。 沒有策略從'__NSArrayI'轉換爲'NSString'。等等每 屬性。 我在網上看到,沒有KVC的映射不支持數組作爲 內部結構。 Plz,幫忙。這裏的正確方法是什麼?

編輯: 實體:

@interface Sendung : NSObject 

@property (nonatomic, strong) NSString *description; 
@property (nonatomic, strong) NSNumber *duration; 
@property (nonatomic, strong) NSNumber *sendungkey; 
@end; 

控制器:

RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[Sendung class]]; 
mapping.forceCollectionMapping = YES; 
[mapping mapKeyOfNestedDictionaryToAttribute:@"sendungkey"]; 
[mapping mapKeyPath:@"(sendungkey).desc" toAttribute:@"description"]; 
[mapping mapKeyPath:@"(sendungkey).duration" toAttribute:@"duration"]; 
[[RKObjectManager sharedManager].mappingProvider addObjectMapping:mapping ]; 
mapping = [[RKObjectManager sharedManager].mappingProvider objectMappingForClass:[Sendung class] ]; 
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:url objectMapping:mapping delegate:self]; 

這是我得到的時候NSlogin結果:( (空), (空), (空) (null), (null) )

+0

是的,因爲你的key1的內容是一個數組。你可以請張貼你的實體以及映射定義嗎? – mja

+0

我編輯了這個問題。謝謝!我嘗試使用NSDictionary,但由於我不知道密鑰,這使我很困惑( – Nigul

+0

不能使用描述作爲屬性。 –

回答

5

我相信你錯過了你的映射的一個'水平'。如果仔細查看輸入內容,則可以使用字典(key1),其中的內容不是單個'Sendung',而是一組這樣的對象。因此,您不能將密鑰1的內容直接映射到Sendung ivars,而不是創建新的類,例如SendungResult

@interface SendungResult : NSObject 
    @property (nonatomic, strong) NSString *keyName; 
    @property (nonatomic, strong) NSArray *sendungs; 
@end 

和使用現在直接使用關係映射KEY1的內容映射到SendungResultsendungs陣列。

編輯:我延長了答案如下:

正如我剛纔所說,你正試圖對象的集合映射到單個實例,所以這是行不通的。相反,您必須創建一個SendungResult,它將爲一個密鑰保存Sendung實例的數組。因此,在您的示例中,最終將有兩個SendungResult實例(其中一個將保存三個Sendung s - 嵌套在"key1"之下,第二個嵌套在"key2"之下)。您不能將這種類型的結構映射到一次類,您必須以與JSON嵌套相同的方式嵌套它們。 Sendung類基本不變。

現在進行映射。您需要定義兩個映射,其中一個將映射根目錄JSON的內容爲兩個SendungResult(每個鍵一個),第二個映射將映射內部部分爲單個Sendung實例。

我們從內部映射開始。

RKObjectMapping *sendungMapping = [RKObjectMapping mappingForClass:[Sendung class]]; 
[sendungMapping mapKeyPath:@"desc" toAttribute:@"desc"]; 
[sendungMapping mapKeyPath:@"duration" toAttribute:@"duration"]; 
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:sendungMapping]; 

這裏沒有什麼真正有趣的,我們只是將keypath映射到您的屬性。現在是外面的部分。

RKObjectMapping *resultMapping = [RKObjectMapping mappingForClass:[SendungResult class]]; 
[resultMapping setForceCollectionMapping:YES]; 
[resultMapping mapKeyOfNestedDictionaryToAttribute:@"keyName"]; 
[resultMapping mapKeyPath:@"(keyName)" toRelationship:@"sendungs" withMapping:sendungMapping]; 
[[[RKObjectManager sharedManager] mappingProvider] addObjectMapping:resultMapping]; 

我們告訴RestKit到的鍵名的keyPath的內容映射到SendungResult類與早期定義的映射發現sendungs財產。

現在我們可以獲取數據

[[RKObjectManager sharedManager] loadObjectsAtResourcePath:@"test.js" objectMapping:resultMapping delegate:self]; 

的RestKit將創建兩個SendungResult實例中,每個陣列包含內Sendung類(3和2,分別地)

注:我強烈建議你可以閱讀RestKit Object Mapping文檔。另外,JSONLint發現你的JSON無效,我不得不刪除分號。所以一定要使用有效的json。

+0

我試了。這是代碼: NSString * url = [[NSString alloc ] initWithFormat:@ 「/ sendungen」]; RKObjectMapping *映射= [RKObjectMapping mappingForClass:[Sendung類]]; [映射mapKeyPathsToAttributes: @ 「DESC」,@ 「描述」, @ 「持續時間」,@」持續時間」, 零]; – Nigul

+0

爲(在鍵的NSString *鍵){ RKObjectMapping * generalMapping = [RKObjectMapping mappingForClass:[OIdClass類]]; [generalMapping mapKeyPath:鍵toAttribute:@ 「發送者」]; [generalMapping mapKeyPath:key toRelationship:key withMapping:mapping]; [[RKObjectManager sharedManager] .mappingProvider setMapping:generalMapping forKeyPath:key]; } [[RKObjectManager sharedManager] loadObjectsAtResourcePath:url delegate:self]; 正如你所看到的,我必須遍歷我的密鑰,然後才能使每個關係:( 結果是沒有錯誤,但我得到空對象:() – Nigul

+0

我不完全遵循爲什麼你必須迭代你的密鑰。請參考我的另一個答案 - http://stackoverflow.com/questions/7726437/restkit-how-does-one-post-an-array-of-objects/7726829#7726829注意:該答案處理張貼數組objets,但是同樣的步驟適用於這裏,你只需要發送[mapping inverseMapping]選擇器。 – mja