【发布时间】: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
谢谢!
【问题讨论】:
标签: objective-c key-value-coding jsonkit