使用 RestKit 映射空响应的对象

Posted

技术标签:

【中文标题】使用 RestKit 映射空响应的对象【英文标题】:Object Mapping an empty response with RestKit 【发布时间】:2012-03-22 16:16:01 【问题描述】:

感谢help here 和 RestKit 邮件列表,我已经能够解析我的 JSON,但现在我遇到了一个新问题,解析一个空响应。下面是当我的查询有结果时 JSON 的样子:

    "blobsList":
        "blobs":
            [   
                "createdOn":"2012-03-16T15:13:12.551Z","description":"Fake description ","hint":"And a useless hint","id":400,"name":"Fake CA one","publicId":"FF6","type":0,

                "createdOn":"2012-03-16T17:33:48.514Z","description":"No hint on this one, but it does have a description.","hint":"Hint","id":402,"name":"Second fake one in CA","publicId":"FF8","type":0
            ]

所以我将它添加到我的映射中:

        RKObjectMapping* blobsListMapping = [RKObjectMapping mappingForClass:[GetResponseInRegionResponseList class]];
        [blobsListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"];

        [[RKObjectManager sharedManager].mappingProvider setMapping:blobMapping forKeyPath:@"blobsList.blobs"];

        [[RKObjectManager sharedManager].mappingProvider setMapping:blobsListMapping forKeyPath:@"blobsList"];

并且是我的课程:

        @interface GetResponseInRegionResponse : NSObject
        
            NSString* name;
            NSString* blobId;
            NSString* description;
            NSString* hint;
        


        @interface GetResponseInRegionResponseList : NSObject
        
            NSArray  *blobsList;
        

但现在问题是我的服务器也可以为 JSON 返回这个:

        "blobsList":"" 

是的,如果查询没有结果,我会返回。它使我的应用程序崩溃

        restkit.object_mapping:RKObjectMapper.m:255 Performing object mapping sourceObject: 
            blobsList = "";
        
         and targetObject: (null)

        2012-03-22 11:56:16.233 Ferret[7399:17a07] T restkit.object_mapping:RKObjectMapper.m:269 Examining keyPath 'blobs' for mappable content...
        2012-03-22 11:56:16.233 Ferret[7399:17a07] D restkit.object_mapping:RKObjectMapper.m:279 Found unmappable value at keyPath: blobs
        2012-03-22 11:56:16.233 Ferret[7399:17a07] T restkit.object_mapping:RKObjectMapper.m:269 Examining keyPath 'blobsList.blobs' for mappable content...
        2012-03-22 11:56:16.239 Ferret[7399:17a07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0xdb1d0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key blobs.'

所以我试图想出一种方法让 ResKit 映射这个空响应。我已经尝试了所有这些:

[[RKObjectManager sharedManager].mappingProvider setMapping:blobListMapping forKeyPath:@"blobsList"];
[[RKObjectManager sharedManager].mappingProvider setMapping:NULL forKeyPath:@"blobsList"];
[blobListMapping mapKeyPath:@"" toAttribute:@"blobsList"];
[blobListMapping mapKeyPath:@"blobsList" toAttribute:@"blobsList"];

但它们都崩溃了。我正在尝试对源代码进行正面和反面,“此类不符合密钥 blob 的密钥值编码”令人费解,因为那里没有任何 blob,只有 blobsList。感谢您的帮助,谢谢!

【问题讨论】:

【参考方案1】:

我在我的项目中遇到了类似的情况。我正在发布到 Web 服务,该服务将我发布的对象返回给我,该对象包含在一个数组中。这导致 RestKit 在解析时崩溃,因为它期望只返回一个对象而不是集合。为了解决这个问题,我实现了 objectLoader:willMapData: 委托方法并将响应对象拉出数组并通过 RestKit 解析发送该对象,一切都很好。

也许你可以做类似的事情。检查您是否在 blobslist 中取回了一个字符串,并将其转换为一个空数组,然后再通过 RestKit 解析发送它。

- (void)objectLoader:(RKObjectLoader *)objectLoader willMapData:(id *)mappableData

    // Horrible hack to convert posted object that gets returned as an array into a single object
    // that can be mapped.
    //
    if ([objectLoader.targetObject isKindOfClass:[TSLPostPostContract class]])
    
        if ([*mappableData isKindOfClass:[NSArray class]])
        
            *mappableData = [*mappableData objectAtIndex:0];
        
    

【讨论】:

willMapData,很好,我会调查一下。现在我让服务器人员尝试更改 JSON,所以我可能没有机会测试它。但是,如果今晚没有完成,我就在上午。谢谢! 我可以检查 objectLoader.response 以查看它是否是“坏”响应,但我不清楚我应该将我的 mappableData 设置为什么。我只想停止解析,返回零个对象。 nil 显然是错误的。我什至尝试构建一个解析对象,解析一个空白字符串,没有这样的运气。 好的,知道了。可怕的黑客,必须有更好的方法。但如果我这样做: *mappableData = [parser objectFromString:@"\"unknownObject\":\"\"" error:nil];我不崩溃,这很好。希望有更好的答案... :-) 我也是,正如您从我的代码中看到的那样,我也认为这是一个可怕的 hack,但它有效,而且我的代码中没有任何问题。 哦,我不介意 willMapData,它看起来很干净,只是讨厌我需要解析一个废话字符串。

以上是关于使用 RestKit 映射空响应的对象的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 更新对象映射空属性

RestKit CoreData 0.20.3 - 映射完成后保存 MOC 之前的额外检查

RESTKit 的问题,无法正确映射

RestKit 不喜欢为 POST 响应映射不同的对象

Restkit 对象映射给出空对象

使用自省restkit的对象映射