Я пытаюсь сериализовать различные объекты, используя кодирование значения ключа, чтобы преобразовать их в NSDictionary, затем JSONKit, чтобы сериализовать NSDictionary в NSString / NSData. У меня проблемы с преобразованием свойств BOOL.
В рекомендациях KVC указано, что valueForKey:
для свойств BOOL создаст номер NSNumber через [NSNumber numberWithBool:]
. JSONKit утверждает, что NSNumbers, созданные с помощью numberWithBool:
, будут сериализованы в true / false. Я проверил заявление JSONKit, и оно работает. Однако когда я получаю доступ к значению BOOL с помощью KVC, я получаю объект, который не выглядит так, как будто он был создан с помощью numberWithBool:
. В частности, он не оценивается равным kCFBooleanTrue, который JSONKit использует в качестве маркера для логического значения. Конечным результатом является то, что мои свойства BOOL сериализуются в 0/1 вместо true / false, что вызывает проблемы для принимающего API.
Как определить, что NSNumber из KVC получен из свойства 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
Спасибо!