2012-04-02 2 views
1

Я пытаюсь сериализовать различные объекты с помощью кодирования по значению ключа, чтобы преобразовать их в 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 

Спасибо!

ответ

0

Вы можете оформить свою реализацию, которая делает это автоматически - https://github.com/QBurst/KVCObjectSerializer

+0

Это та же проблема, что есть моя реализация, которая является то, что 'BOOL' преобразуется в '0' или '1', а не' true' или 'false'. За подробной информацией обращайтесь к https://gist.github.com/3762811. – jagill

+0

Спасибо за отзыв. Будет рассмотрен вопрос и ваша реализация. :) –