Restkit NSString包含元数据

时间:2013-06-23 00:44:55

标签: objective-c json restkit

我有一个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的源代码,寻找原因。

2 个答案:

答案 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的情况下构建我的应用程序时,记录实际对象的描述非常重要。