RestKit 对象映射在 BOOL 的空 JSON 值上崩溃

Posted

技术标签:

【中文标题】RestKit 对象映射在 BOOL 的空 JSON 值上崩溃【英文标题】:RestKit Object Mapping Crashes on null JSON value for BOOL 【发布时间】:2012-11-13 20:29:23 【问题描述】:

我有一些从服务返回的 JSON,对于布尔属性,有时该服务将具有 null 而不是 true/false;像这样:

"hide_locations" : null,

我接收这个值的对象有一个属性:

@property (nonatomic, assign) BOOL hideLocations;

我的映射是这样配置的:

RKObjectMapping *retVal = [RKObjectMapping mappingForClass:[self class]];
[retVal mapKeyPath:@"hide_locations" toAttribute:@"hideLocations"];

但是当我执行映射时,RestKit 0.10.3 在这条线上崩溃了:

[self.destinationObject setValue:value forKeyPath:attributeMapping.destinationKeyPath];

在 - (void)applyAttributeMapping:(RKObjectAttributeMapping *)attributeMapping withValue:(id)value

在 RKObjectMappingOperation.m 中出现以下错误:

2012-11-13 09:33:04.352 Tests[73816:5f03] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“[setNilValueForKey]:无法将 nil 设置为键 hideLocations 的值。'

在我看来,像这样成熟的框架并不能更优雅地处理这种情况,这让我觉得很奇怪,所以我不禁认为我配置了一些不正确的东西。如果您有任何见解,我将不胜感激。

【问题讨论】:

【参考方案1】:

null 在 JSON 中不是有效的布尔值,只有 true 和 false,所以我认为您在 Objective-c 中的对象映射将其设为 BOOL 是错误的。您可能应该修复 json 以正确表示布尔值(这样您就不会有任何空值崩溃)或将 hide_locations/hideLocations 视为 NSString 并在您的代码中使用 [hideLocations boolValue] 如果需要。

【讨论】:

哦,我意识到 null 不是有效的 BOOL。这根本不是我的问题。我的问题是,RestKit 对这种无效输入不能容错似乎令人惊讶,我想问是否有办法配置它来优雅地处理这种情况。 答案是否定的,它假定您没有尝试将 null 映射到布尔值。查看 restkit 源代码,没有任何检查或配置可以避免这种情况。 JSON 不是容错的。一个字符错误,您的整个输入将不会被解析。如果您在期望 bool 时得到一个 null 值,那么服务器可能打算让您以不同的方式对待它们。【参考方案2】:

不幸的是,RestKit 似乎不能很好地容忍这种输入。

到目前为止,我收到的关于防止此问题的最佳可用建议来自 RestKit 的 Blake Watters,他说:

你应该只在你的目标上实现setNilValueForKey: 对象并适当地处理它。

所以,你有它,或者预先清理你的 JSON,或者阻止对 setNilValueForKey: 的调用

参考:https://groups.google.com/forum/?fromgroups=#!topic/restkit/dlYVd0zCr3c

【讨论】:

以上是关于RestKit 对象映射在 BOOL 的空 JSON 值上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 GET 上创建的 RestKit 托管对象总是为 bool 返回 false

如何使用 restkit 忽略已发布对象上的空属性

RESTKit 对象 BOOL 属性为真/假 JSON

RestKit 0.20:restkit 对象映射使属性映射加倍

Restkit 对象映射在映射过程中遇到错误

RestKit - 没有对象映射的请求