Key-Valueコーディングを使用してオブジェクトをNSDictionaryに変換し、次にJSONKitを使用してNSDictionaryをNSString / NSDataにシリアル化することにより、さまざまなオブジェクトをシリアル化しようとしています。BOOLプロパティの変換で問題が発生しています。
KVCガイドラインでvalueForKey:
は、BOOLプロパティの場合、を介してNSNumberを作成すると記載されてい[NSNumber numberWithBool:]
ます。JSONKitは、を介して作成されたNSNumbernumberWithBool:
がtrue/falseにシリアル化されると述べています。JSONKitの主張をテストしましたが、機能します。ただし、KVCを使用してBOOL値にアクセスすると、を介して作成されたように見えないオブジェクトが表示されnumberWithBool:
ます。特に、JSONKitがブール値のマーカーとして使用するkCFBooleanTrueと同等とは評価されません。その結果、BOOLプロパティがtrue / falseではなく0/1にシリアル化されるため、受信APIに問題が発生します。
KVCのNSNumberが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
ありがとう!