我正在尝试序列化各种对象,方法是使用键值编码将它们转换为NSDictionary,然后使用JSONKit将NSDictionary序列化为NSString/NSData。我遇到了转换BOOL属性的问题。
KVC guidelines声明valueForKey:将通过[NSNumber numberWithBool:]为BOOL属性创建一个NSNumber。通过numberWithBool:创建的JSONKit states that NSNumbers将被序列化为true/false。我已经测试了JSONKit的声明,它工作正常。但是,当我使用KVC访问BOOL值时,我得到的对象看起来不像是通过numberWithBool:创建的。特别是,它的计算结果不等于kCFBooleanTrue,JSONKit将其用作布尔值的标记。最终结果是我的BOOL属性被序列化为0/1,而不是true/false,这给接收API带来了问题。
如何确定来自KVC的NSNumber是否来自BOOL属性?我是不是读错了苹果的文档?或者,有没有其他方法可以让这个序列化过程工作?
下面是失败的测试:
#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谢谢!
发布于 2012-06-09 12:27:23
您可能希望检查我的实现,它会自动执行此操作-- https://github.com/QBurst/KVCObjectSerializer
https://stackoverflow.com/questions/9985082
复制相似问题