Restkit 从 NSNumber 序列化布尔值
Posted
技术标签:
【中文标题】Restkit 从 NSNumber 序列化布尔值【英文标题】:Restkit Serializing a Boolean from NSNumber 【发布时间】:2012-07-08 05:40:58 【问题描述】:其中一个托管对象具有一个由 NSNumber 类型表示的属性“isMember”。当通过 RestKit 序列化到 Json 帖子正文时,它总是给出 0/1 而不是 YES/NO 或 true/false。当从 json 结果映射到对象时,RestKit 能够成功地将 YES/NO 转换为 NSNumber。有什么方法可以强制将布尔属性序列化为 YES/NO 或 true/false?
Serialize: 0 -> 0, 1 -> 1
Deserialize : YES/true -> 1, NO/false -> 0
【问题讨论】:
0 和 1 等价于 NO 和 YES,BOOL 是整数兼容类型。有什么问题? 是的,你是对的。我仔细检查了 Json 文档并发现相同。 【参考方案1】:在NSNumber表示中,0相当于NO,1相当于YES;此外 BOOL 是整数兼容类型,通常是无符号字符。这里没有矛盾。
【讨论】:
问题是一个BOOL在json中被序列化为0或1。但是,json 发送到的服务器期望 true 或 false。【参考方案2】:您可以使用其中一种委托方法手动更改值:
- (void)objectLoader:(RKObjectLoader *)objectLoader didSerializeSourceObject:(id)sourceObject toSerialization:(inout id<RKRequestSerializable> *)serialization
NSMutableDictionary *params = ((NSDictionary*)*serialization).mutableCopy;
NSNumber *value = [params objectForKey:@"myBoolean"];
[params setObject:value.boolValue ? @"true" : @"false" forKey:@"myBoolean"];
*serialization = params;
更新
我发现这仅在您将正文作为普通文本/html 参数发送时才有效。当将 RKObjectManager 的 serializationMIMEType 设置为 RKMIMETypeJSON 时,序列化对象将是 json 作为 NSData。在这种情况下,您仍然可以操作序列化对象,但您必须解析 json,对其进行更改,然后再次对其进行序列化。
【讨论】:
以上是关于Restkit 从 NSNumber 序列化布尔值的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSNumberFormatter 和 RestKit 将 NSCFNumber 转换为 NSNumber 时出错
从 NSDictionary 获取包含 NSNumber 布尔值的键列表,其中值为 @YES
检查 NSDictionary 中的键 - 不使用布尔 NSNumber 作为值 @iOS8