带有键值编码和 BOOL 的 JSONKit

Posted

技术标签:

【中文标题】带有键值编码和 BOOL 的 JSONKit【英文标题】:JSONKit with Key-Value Coding and BOOLs 【发布时间】:2012-04-02 23:13:11 【问题描述】:

我试图序列化各种对象,方法是使用键值编码将它们转换为 NSDictionary,然后使用 JSONKit 将 NSDictionary 序列化为 NSString/NSData。我在转换 BOOL 属性时遇到问题。

KVC guidelines 状态 valueForKey: 将通过 [NSNumber numberWithBool:] 创建一个 NSNumber,对于 BOOL 属性。 JSONKit states that 通过numberWithBool: 创建的NSNumbers 将被序列化为真/假。我已经测试了 JSONKit 的声明并且它有效。但是,当我使用 KVC 访问 BOOL 值时,我得到一个看起来不像是通过 numberWithBool: 创建的对象。特别是,它的计算结果不等于 kCFBooleanTrue,JSONKit 将其用作布尔值的标记。最终结果是我的 BOOL 属性被序列化为 0/1 而不是 true/false,这导致接收 API 出现问题。

如何确定来自 KVC 的 NSNumber 是否来自 BOOL 属性?我是否误读了 Apple 的文档?还是有其他方法可以让这个序列化过程起作用?

下面是失败的测试:

#import "JSONKit.h"

- (void) testCompareKVCBoolToNumberWithBool 
    NSNumber *numberBool = [NSNumber numberWithBool:YES];
    //This passes
    STAssertTrue(numberBool == (id)kCFBooleanTrue, @"Number %@ should kCFBooleanTrue.", numberBool);

    TestModel *model = [[TestModel alloc] init];
    model.boolProperty = YES;
    NSNumber *kvcBool = [model valueForKey:@"boolProperty"];
    //This fails
    STAssertTrue(kvcBool == (id)kCFBooleanTrue, @"Number %@ should be a kCFBooleanTrue.", kvcBool);

    NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                      numberBool, @"numberBool",
                      kvcBool, @"kvcBool",
                      nil];
    NSString *jsonString = [dict JSONString];
    //This yields: jsonString: "kvcBool":1,"numberBool":true
    NSLog(@"jsonString: %@", jsonString);

这是 TestModel 代码:

@interface TestModel : NSObject 
@property (assign)          BOOL            boolProperty;
@end

@implementation TestModel
@synthesize boolProperty = _boolProperty;
@end

谢谢!

【问题讨论】:

【参考方案1】:

您可能想查看我的实现,它会自动执行此操作 - https://github.com/QBurst/KVCObjectSerializer

【讨论】:

这和我的实现有同样的问题,即BOOL被转换成01,而不是truefalse。查看gist.github.com/3762811了解更多详情。 感谢您的反馈。将调查问题和您的实施。 :)

以上是关于带有键值编码和 BOOL 的 JSONKit的主要内容,如果未能解决你的问题,请参考以下文章

URL编码参数中的布尔值在Swift3中使用Alamofire编码为0和1

获取 CodingKeys 键值

带有多个 sortDescriptor 和 Bool 过滤器的 Swift fetchRequest

类不符合键值编码

绑定和核心数据:实体 xxx 不符合键“(null)”的键值编码

来自 NSMethodSignature 的 BOOL 编码错误