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!
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
Danke für die Rückmeldung. Wird das Problem und Ihre Implementierung untersuchen. :) –