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