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 参数发送时才有效。当将 RKObjectManagerserializationMIMEType 设置为 RKMIMETypeJSON 时,序列化对象将是 json 作为 NSData。在这种情况下,您仍然可以操作序列化对象,但您必须解析 json,对其进行更改,然后再次对其进行序列化。

【讨论】:

以上是关于Restkit 从 NSNumber 序列化布尔值的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSNumberFormatter 和 RestKit 将 NSCFNumber 转换为 NSNumber 时出错

从 NSDictionary 获取包含 NSNumber 布尔值的键列表,其中值为 @YES

检查 NSDictionary 中的键 - 不使用布尔 NSNumber 作为值 @iOS8

RestKit - 不符合键值编码

IOS/目标 C:Coredata NSPredicate 与布尔值

为啥 Xcode 会为我的模型类的布尔属性生成 NSNumber 属性?