1

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

KVC 指南声明,对于valueForKey:BOOL 属性,将通过[NSNumber numberWithBool:]. JSONKit声明通过创建的 NSNumbernumberWithBool:将被序列化为真/假。我已经测试了 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

谢谢!

4

1 回答 1

0

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

于 2012-06-09T04:27:23.153 回答