2012-04-02 15 views
1

Ich versuche, verschiedene Objekte zu serialisieren, indem Sie Key-Value Coding verwenden, um sie in ein NSDictionary zu konvertieren, und dann JSONK, um das NSDictionary in einem NSString/NSData zu serialisieren. Ich habe Probleme beim Konvertieren von BOOL-Eigenschaften.JSONKit Key-Value Coding und BOOLs

Der KVC guidelines-Status valueForKey: wird für BOOL-Eigenschaften eine NSNummer über [NSNumber numberWithBool:] erstellen. JSONKit states that NSNumbers, die über numberWithBool: erstellt wurden, werden auf "True/False" serialisiert. Ich habe JSONKits Behauptung getestet und es funktioniert. Wenn ich jedoch mit KVC auf einen BOOL-Wert zugreife, bekomme ich ein Objekt, das nicht so aussieht, als wäre es über numberWithBool: erstellt worden. Insbesondere wird nicht gleich kCFBooleanTrue ausgewertet, das JSONKit als Marker für einen Booleschen Wert verwendet. Das Endergebnis ist, dass meine BOOL-Eigenschaften auf 0/1 statt auf wahr/falsch serialisiert sind, was Probleme für die empfangende API verursacht.

Wie kann ich feststellen, ob eine NSNumber von KVC aus einer BOOL-Eigenschaft stammt? Werde ich die Dokumentation von Apple falsch lesen? Oder gibt es eine andere Möglichkeit, dieses Serialisierungsverfahren zum Laufen zu bringen?

Unten ist der Test, der fehlschlägt:

#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); 
} 

Und hier ist der TestModel Code:

@interface TestModel : NSObject 
@property (assign)   BOOL   boolProperty; 
@end 

@implementation TestModel 
@synthesize boolProperty = _boolProperty; 
@end 

Dank!

Antwort

0

Möglicherweise möchten Sie meine Implementierung zur Kasse, die dies automatisch tut - https://github.com/QBurst/KVCObjectSerializer

+0

Dies hat das gleiche Problem, dass meine Implementierung hat, das ist, dass ein 'BOOL' in '0' oder '1' umgewandelt wird, nicht' wahr oder falsch. Weitere Informationen finden Sie unter https://gist.github.com/3762811. – jagill

+0

Danke für die Rückmeldung. Wird das Problem und Ihre Implementierung untersuchen. :) –