Я пытаюсь сериализовать различные объекты с помощью кодирования по значению ключа, чтобы преобразовать их в NSDictionary, затем JSONKit для сериализации NSDictionary для NSString/NSData. У меня проблемы с преобразованием свойств BOOL.JSONKit с кодировкой по значению и BOOLs
KVC guidelines указывает, что valueForKey:
, для свойств BOOL, создает NSNumber через [NSNumber numberWithBool:]
. JSONKit states that 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
Спасибо!
Это та же проблема, что есть моя реализация, которая является то, что 'BOOL' преобразуется в '0' или '1', а не' true' или 'false'. За подробной информацией обращайтесь к https://gist.github.com/3762811. – jagill
Спасибо за отзыв. Будет рассмотрен вопрос и ваша реализация. :) –