2012-04-02 7 views
1

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 

ありがとう!

答えて

0

あなたはこれを自動的に行い、私の実装をチェックアウトすることをお勧めします - https://github.com/QBurst/KVCObjectSerializer

+0

これは 'BOOL'が '0'または '1'に変換されていることである私の実装が持っている同じ問題を、持っている、ではありません' trueまたはfalseを返します。詳細についてはhttps://gist.github.com/3762811をご覧ください。 – jagill

+0

フィードバックいただきありがとうございます。問題と実装について検討します。 :) –

関連する問題