JSONKit с кодированием значения ключа и BOOL - PullRequest
1 голос
/ 03 апреля 2012

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

Спасибо!

1 Ответ

0 голосов
/ 09 июня 2012

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

...