2012-01-15 32 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;

相关问题