我试图序列化各种对象,方法是使用键值编码将它们转换为 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
谢谢!