2012-03-22 89 views
2

感謝help here和RestKit郵件列表,我已經能夠解析我的JSON,但現在我有一個新問題,解析一個空的響應。要設置舞臺,這裏是JSON的外觀,當我查詢有結果,如:對象使用RestKit映射一個空的響應

{"blobsList": 
     {"blobs": 
      [ 
       {"createdOn":"2012-03-16T15:13:12.551Z","description":"Fake description ","hint":"And a useless hint","id":400,"name":"Fake CA one","publicId":"FF6","type":0}, 

       {"createdOn":"2012-03-16T17:33:48.514Z","description":"No hint on this one, but it does have a description.","hint":"Hint","id":402,"name":"Second fake one in CA","publicId":"FF8","type":0} 
      ]}} 

所以我將此添加到我的映射:

 RKObjectMapping* blobsListMapping = [RKObjectMapping mappingForClass:[GetResponseInRegionResponseList class]]; 
     [blobsListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"]; 

     [[RKObjectManager sharedManager].mappingProvider setMapping:blobMapping forKeyPath:@"blobsList.blobs"]; 

     [[RKObjectManager sharedManager].mappingProvider setMapping:blobsListMapping forKeyPath:@"blobsList"]; 

,並是我的職業:

 @interface GetResponseInRegionResponse : NSObject 
     { 
      NSString* name; 
      NSString* blobId; 
      NSString* description; 
      NSString* hint; 
     } 


     @interface GetResponseInRegionResponseList : NSObject 
     { 
      NSArray  *blobsList; 
     } 

但現在的皺紋是我的服務器也可以返回這個JSON:

 {"blobsList":""}  

是的,如果查詢沒有結果,我會回來。它崩潰我的應用程序

 restkit.object_mapping:RKObjectMapper.m:255 Performing object mapping sourceObject: { 
         blobsList = ""; 
     } 
      and targetObject: (null) 

     2012-03-22 11:56:16.233 Ferret[7399:17a07] T restkit.object_mapping:RKObjectMapper.m:269 Examining keyPath 'blobs' for mappable content... 
     2012-03-22 11:56:16.233 Ferret[7399:17a07] D restkit.object_mapping:RKObjectMapper.m:279 Found unmappable value at keyPath: blobs 
     2012-03-22 11:56:16.233 Ferret[7399:17a07] T restkit.object_mapping:RKObjectMapper.m:269 Examining keyPath 'blobsList.blobs' for mappable content... 
     2012-03-22 11:56:16.239 Ferret[7399:17a07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0xdb1d0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key blobs.' 

所以我試圖想出一個辦法讓RESKIT映射此空響應。我試過所有這些:

[[RKObjectManager sharedManager].mappingProvider setMapping:blobListMapping forKeyPath:@"blobsList"]; 
[[RKObjectManager sharedManager].mappingProvider setMapping:NULL forKeyPath:@"blobsList"]; 
[blobListMapping mapKeyPath:@"" toAttribute:@"blobsList"]; 
[blobListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"]; 

但他們都崩潰了。我試圖對源代碼進行正面和反面的描述,「這個類不是關鍵代碼的關鍵值編碼」,令人費解,因爲這裏沒有任何blob,只是blobsList。我感謝任何幫助,謝謝!

回答

3

我在我的項目中遇到了類似的情況。我正在發佈到一個Web服務,該服務正在返回給我包裹在一個數組中的我發佈的對象。這導致RestKit在解析時崩潰,因爲它預期只返回一個對象而不是集合。爲了解決這個問題,我實現了objectLoader:willMapData:delegate方法,並將響應對象從數組中取出並通過RestKit解析發送該對象,一切正常。

也許你可以做類似的事情。檢查是否在blobslist中取回字符串並在通過RestKit解析發送它之前將其轉換爲空數組。

- (void)objectLoader:(RKObjectLoader *)objectLoader willMapData:(id *)mappableData 
{ 
    // Horrible hack to convert posted object that gets returned as an array into a single object 
    // that can be mapped. 
    // 
    if ([objectLoader.targetObject isKindOfClass:[TSLPostPostContract class]]) 
    { 
     if ([*mappableData isKindOfClass:[NSArray class]]) 
     { 
      *mappableData = [*mappableData objectAtIndex:0]; 
     } 
    } 
} 
+0

willMapData,很好,我會研究它。現在我有服務器人嘗試更改JSON,所以我可能沒有機會測試它。但是,如果今晚沒有完成,我在AM中就是如此。謝謝! – 2012-03-27 00:56:09

+0

我能夠檢查objectLoader.response,看看它是否是「壞」的迴應,但我不清楚我應該設置我的mappableData。我只是想停止解析,回零對象。無顯然是錯誤的。我甚至嘗試建立一個解析對象,解析一個空白字符串,沒有這樣的運氣。 – 2012-03-27 14:01:51

+0

好吧,明白了。可怕的黑客,一定有更好的辦法。但是,如果我這樣做:* mappableData = [解析器objectFromString:@「{\」unknownObject \「:\」\「}」錯誤:無];我不會崩潰,這很好。會愛一個更好的答案...: - ) – 2012-03-27 14:18:07