我有一个JSON文件,我正在从网上下载并使用RestKit进行解析。我的问题是,我有一个字符串数组的属性,我试图映射到他们自己的对象。出于某种原因,在解析该字符串时,它最终会在字符串中包含元数据对象的描述。请查看下面我的代码片段,了解我目前正在使用的内容以及我遇到的错误。注意:我删除了任何核心数据集成,并尽可能地尝试跟踪问题。
对象接口
@interface BLAuthor : NSObject
@property (nonatomic, retain) NSString *name;
@end
@interface BLVolume : NSObject
@property (nonatomic, retain) NSString *id;
@property (nonatomic, retain) NSSet *authors;
@end
映射和请求操作
RKObjectMapping *volumeMapping = [RKObjectMapping mappingForClass:[BLVolume class]];
[volumeMapping addAttributeMappingsFromDictionary:@{ @"id": @"id" }];
RKObjectMapping *authorMapping = [RKObjectMapping mappingForClass:[BLAuthor class]];
[authorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil
toKeyPath:@"name"]];
[volumeMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"volumeInfo.authors"
toKeyPath:@"authors"
withMapping:authorMapping]];
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:volumeMapping
pathPattern:nil
keyPath:@"items"
statusCodes:statusCodes];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://example.com/?q=123"]];
RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]];
[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *result) {
NSLog(@"Success! %@", result);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@"Failed with error: %@", [error localizedDescription]);
}];
NSOperationQueue *operationQueue = [NSOperationQueue new];
[operationQueue addOperation:operation];
JSON代码段
{
"items": [
{
"id": "abc",
"volumeInfo": {
"authors": [
"123"
]
}
}
结果数据 - 请注意,< BLAuthor = 0x08466250 |之后的所有内容name = 实际上是BLAuthor上NSString属性的一部分:
Success! <RKMappingResult: 0x8468560, results={
items = (
"<BLVolume = 0x08463F60 | id = mikPQFhIPogC | authors = {(
<BLAuthor = 0x08466250 | name = 123 ({
HTTP = {
request = {
URL = \"https://example.com/?q=123";
headers = {
};
method = GET;
};
response = {
URL = \"https://example.com/?q=123\";
headers = {
\"Cache-Control\" = \"private, max-age=0, must-revalidate, no-transform\";
\"Content-Type\" = \"application/json; charset=UTF-8\";
Date = \"Sun, 23 Jun 2013 00:41:01 GMT\";
Etag = \"\\\"I09ELXbrmOlE-RFCkDsRbIJj278/gPh8_OxpfA9YHXz_P_25F8A4orw\\\"\";
Expires = \"Sun, 23 Jun 2013 00:41:01 GMT\";
Server = GSE;
\"Transfer-Encoding\" = Identity;
\"X-Content-Type-Options\" = nosniff;
\"X-Frame-Options\" = SAMEORIGIN;
提前感谢任何可以帮我解决此问题的人!我的智慧结束了 - 试图从我的测试中删除尽可能多的变量,并搜索了Web和RestKit的源代码,寻找原因。
答案 0 :(得分:1)
问题出在这个映射
上[authorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil
toKeyPath:@"name"]];
您基本上是在说:“将您找到的任何内容映射到name
属性”。
这只有在您匹配路径而不是响应描述符中的键时才会起作用,如建议的here。但是为了做到这一点,你需要响应来独立返回字符串数组,这不是你的情况。
根据同一篇文章,您可以尝试使用
[authorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@""
toKeyPath:@"name"]];
但我怀疑它可以奏效。
如果您可以控制API,我建议通过返回完整的资源而不是数组中的纯字符串,将格式更改为更加REST的格式。
答案 1 :(得分:1)
所以,我得出了一个悲伤的结论 - 没有任何东西被破坏,我的代码完美无缺。
通过关系,显然RestKit会将您的对象设置为NSProxy子类。子类重写-description并返回@“%@(%@)”,originalObject,metadata。因此,当记录对象的描述时,我得到了,而不是ACTUAL对象的值。非常刺激,很难追查。我将在RestKit上打开一个问题来删除这个令人困惑的描述,因为在没有UI的情况下构建我的应用程序时,记录实际对象的描述非常重要。