Key-Value Codingを使用してNSDictionaryに変換し、JSONKitを使用してNSDictionaryをNSString/NSDataにシリアル化することで、さまざまなオブジェクトをシリアル化しようとしています。私はBOOLプロパティを変換する際に問題が発生しています。キー値コーディングとBOOLを持つJSONKit
KVC guidelinesvalueForKey:
は、BOOLプロパティの場合、[NSNumber numberWithBool:]
でNSNumberを作成します。 JSONKit states thatnumberWithBool:
で作成されたNSNumberは、true/falseにシリアル化されます。私はJSONKitの主張をテストしています。しかし、KVCでBOOL値にアクセスすると、numberWithBool:
で作成されたように見えないオブジェクトが表示されます。特に、JSONKitがbooleanのマーカーとして使用する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
ありがとう!
これは 'BOOL'が '0'または '1'に変換されていることである私の実装が持っている同じ問題を、持っている、ではありません' trueまたはfalseを返します。詳細についてはhttps://gist.github.com/3762811をご覧ください。 – jagill
フィードバックいただきありがとうございます。問題と実装について検討します。 :) –