2012-01-15 29 views
1

我想使用RestKit的RKObjectManager將JSON數據反序列化到我的iPhone應用程序。獲取「這個類不是密鑰編碼兼容的密鑰ID」。當請求RestKit loadObjectsAtResourcePath

我現在的問題是,應用程序崩潰了:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Course 0x6e71b10> valueForUndefinedKey:]: this class is not key value coding-compliant for the key id.' 

當我打電話:

[manager loadObjectsAtResourcePath:@"/courses" delegate:nil]; 

我的領域類 - Course.h看起來像

#import <Foundation/Foundation.h> 



@interface Course : NSObject { 

} 

@property(nonatomic) NSInteger *id; 

@property(nonatomic, retain) NSString *name; 

-(id)initWithIdAndName: (NSInteger *)inId inName:(NSString *)inName; 
@end 

和Course.m看起來像

#import "Course.h" 
#import "NSDictionary+RKAdditions.h" 


@implementation Course { 

} 
@synthesize name = _name; 
@synthesize id = _id; 

- (id)initWithIdAndName:(NSInteger *)inId inName:(NSString *)inName { 
    _name = inName; 
    _id = inId; 
    return self; 

} 

#pragma mark NSCoding Protocol 


- (void)encodeWithCoder:(NSCoder *)encoder; 
{ 
[encoder encodeInteger:[self id] forKey:@"id"]; 
[encoder encodeObject:[self name] forKey:@"name"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder; 
{ 
if (![super init]) 
    return nil; 

[self setId:[decoder decodeIntForKey:@"id"]]; 
[self setName:[decoder decodeObjectForKey:@"name"]]; 


return self; 
} 

@end 

從服務器檢索的JSON數據是

{"courses":[{"id":1,"name":"course 1"},{"id":2,"name":"course 2"}]} 

而且RKObjectManager使用如下代碼調用:

RKObjectMapping* courseMapping = [RKObjectMapping mappingForClass:[Course class]]; 
[courseMapping mapKeyPath:@"id" toAttribute:@"id"]; 
[courseMapping mapKeyPath:@"name" toAttribute:@"name"]; 


RKObjectManager *manager = [RKObjectManager objectManagerWithBaseURL:@"http://firstbit/of/url"]; 

[manager.mappingProvider setMapping:courseMapping forKeyPath:@"courses"]; 
[manager loadObjectsAtResourcePath:@"/endpoint" delegate:nil]; 

在這一個任何想法?

+0

也許你可以嘗試改變id屬性爲類似courseId,以避免可能的命名衝突。 – mja 2012-01-15 22:27:22

+0

我不認爲這是問題,但應該是NSInteger,而不是NSInteger *反正:http://stackoverflow.com/questions/1014053/why-dont-i-declare-nsinteger-with-a – pshah 2012-11-06 19:20:22

回答

5

它可以幫助其他s,但我遇到了這個問題,原因是我在對象定義中使用了NSInteger。 RestKit cannot map to NSInteger, only NSNumber

+0

你確定他們不會以某種方式解釋這個嗎?我在當前項目的許多地方成功映射到NSIntegers。 – 2012-10-30 21:14:28

+0

@Kyle我同意亞歷山大,我不認爲RestKit支持映射到原始類型。因此,例如必須將JSON布爾映射到NSNumber * – pshah 2012-11-06 19:22:12

1

可能是值得檢查JSON的格式取回有效&(鍵/值類型),你期望 - 我已經受夠了RESTKit此完全相同的問題之前

我用「JSON驗證」 &「可視化JSON」,無論是在Mac App Store中免費

或者請確保您的CoreData實體允許一對多映射課程

+0

是的, Visual JSON非常棒!在嵌套的JSON中,很快會出現錯誤的路徑 - 樹視圖有助於把事情做好。 – brainray 2013-11-06 08:46:35

3

我發佈這個作爲替代答案。到目前爲止的答案是完全正確的。還有一個排列讓我花了一段時間找到。模擬器可能已經爲程序緩存了一個bundle資源。如果此捆綁資源已過期,則可能發生衝突。最簡單的解決方案:從模擬器中「卸載」應用程序(以及可能具有相同名稱捆綁的其他應用程序)。一旦我這樣做了,我立即發現了真正的問題,因爲我沒有正確地將我的包綁定到sdk項目的父項目。

7

我得到了同樣的錯誤,雖然我的問題是在使用CoreData更改我的測試時忘記刪除@synthesize中的@dynamic指令。


+1

感謝您發表此評論,我也從核心數據模型轉到使用對象映射,並且忘記將屬性切換回@synthesize。 – Michael 2013-10-30 00:05:46

+0

是的!非常感謝! – altagir 2015-07-15 00:49:17

1

這一個可能看起來很明顯,但它讓我兩天...

確保所有類在RKObjectMappings是正確的!在我使用父類來嵌套元素的映射時,這是一個小錯字,在我從未看過的一行代碼中,因爲我認爲它絕對正確,並且它讓整個事情崩潰。

0

不幸的是,由於許多與屬性或關係映射有關的問題,可能會出現此錯誤。

這包括任何屬性名稱中的拼寫錯誤。

請記住,屬性或關係映射不正確,除非它的與您的API一致。例如,我剛碰到這個錯誤,原因如下:

每個Restaurant模型與Location模型有一個外鍵關係。

[restaurantMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"location" toKeyPath:@"location" withMapping:locationMapping]]; 

但我使用返回類似下面的JSON數據爲Restaurant對象的API:

{ 
    "id": 42, 
    "resource_uri": "http://example.com/api/v1/restaurants/42", 
    "location": "http://example.com/api/v1/locations/987" 
} 

RestKit正在尋找類似下面的響應:

{ 
    "id": 42, 
    "resource_uri": "http://example.com/api/v1/restaurants/42", 
    "location": { 
     "id": 987, 
     "resource_uri": "http://example.com/api/v1/locations/987" 
    } 
} 

請注意不同的location值。

我想你也可以改變RestKit來處理以前的API響應,但是期望不匹配會導致這種類型的錯誤。

0

RestKit無法映射到NSInteger的接受答案狀態,我發現它並非完全正確,因爲我最近遇到了同樣的問題,只是通過刪除NSInteger屬性的*來解決它。

我用@property(nonatomic) NSInteger id;代替@property(nonatomic) NSInteger *id;

相關問題