Objective c Restkit NSString包含元数据

Objective c Restkit NSString包含元数据,objective-c,json,restkit,Objective C,Json,Restkit,我有一个JSON文件,我正在从web下载并使用RestKit进行解析。我的问题是,我有一个带有字符串数组的属性,我正试图映射到它们自己的对象中。出于某种原因,在解析该字符串时,它最终会在字符串中包含元数据对象的描述。请参阅下面我的代码片段,了解我当前使用的内容以及我遇到的错误。注意:我删除了任何核心数据集成,并尽可能地进行了测试,以试图追踪问题 对象接口 @interface BLAuthor : NSObject @property (nonatomic, retain) NSString

我有一个JSON文件,我正在从web下载并使用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"
    ]
  }
}

结果数据-请注意,之后的所有内容都与此映射有关

[authorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil
                                                                    toKeyPath:@"name"]];
您基本上是说:“将您找到的任何内容映射到
name
属性”

这只能在您匹配路径而不是响应描述符中的键的情况下工作,如建议的那样。但为了实现这一点,您需要响应返回独立的字符串数组,而这不是您的情况

根据相同的帖子,你可以尝试

[authorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@""
                                                                    toKeyPath:@"name"]];
但我怀疑这是否可行


如果您可以控制API,我建议您将格式更改为更为RESTful的格式,方法是返回完整的资源,而不是数组中的普通字符串。

因此,我得出了一个悲哀的结论——没有任何内容被破坏,我的代码工作得非常完美


通过关系,RestKit将对象设置为NSProxy子类。子类重写-description并返回@“%@(%@)”、originalObject和元数据。所以当记录对象的描述时,我得到的是它,而不是实际对象的值。非常恼人,很难找到。我将在RestKit上打开一个问题,以删除这个令人困惑的描述,因为在没有UI的情况下构建我的应用程序时,记录实际对象的描述是很重要的。

我感谢这个建议,但是我已经尝试过了,但它不起作用。我在-[RKMappingOperation valueForKeyPath:“由于未捕获的异常“NSUnknownKeyException”而终止应用程序时遇到异常,原因:“[valueForUndefinedKey:]:此类不符合密钥的键值编码。”-它尝试获取密钥@的值。此外,我无法控制API对其进行任何更改,不幸的是!因此,如果您在卷中迭代作者并打印name属性,您会得到什么?很抱歉响应延迟。我得到了实际值。但是,由于我将整个数据作为一个整体记录下来,它抓住了描述,把我搞糊涂了。嗨,我也遇到了这个问题,你应该使用[results.items.authors mutableCopy];删除元数据。见:
[authorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:@""
                                                                    toKeyPath:@"name"]];