带有键值编码和 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
被转换成0
或1
,而不是true
或false
。查看gist.github.com/3762811了解更多详情。
感谢您的反馈。将调查问题和您的实施。 :)以上是关于带有键值编码和 BOOL 的 JSONKit的主要内容,如果未能解决你的问题,请参考以下文章
URL编码参数中的布尔值在Swift3中使用Alamofire编码为0和1
带有多个 sortDescriptor 和 Bool 过滤器的 Swift fetchRequest