28

NSJSONSerialization dataWithJSONObjectを使用して、クラスをJSONにシリアル化します。BOOLをシリアル化すると、JSON文字列で値1または0が与えられます。代わりに、これがtrueまたはfalseである必要があります。これを一般的に行うことは可能ですか?

4

6 に答える 6

30

を作成する[NSNumber numberWithBool:NO]と、NSJSONSerializationはJSON文字列に「false」という単語を返します。

編集新しいショートカットを使用すると、これらの便利な人を使用することもできます:

@(YES) /   @(NO)
@(1)   /   @(0)
@YES   /   @NO
@1     /   @0

このようにして、値をループするようなことを避けることができます。正反対の動作が必要ですが、NSNumberオブジェクトがあります。だから私はループする必要があります...

編集II

mbiはコメントの中で、iOSのバージョンには違いがあると指摘しました。だからここにiOS9テストがあります:

NSDictionary *data = @{
    @"a": @(YES),
    @"b": @YES,
    @"c": @(1),
    @"d": @1
};
NSLog(@"%@", [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:data options:0 error:nil] encoding:NSUTF8StringEncoding]);

2016-07-05 02:23:43.964 Test App[24581:6231996] {"a":true,"b":true,"c":1,"d":1}
于 2013-06-21T11:59:07.417 に答える
15

これに出くわしただけで、これが最良の答えかどうかはわかりませんが...

必ず@YESまたは@NOを使用してください。そうしないと、出力されたjsonにtrue/falseが含まれます。

[NSJSONSerialization dataWithJSONObject:@{@"test": @YES} options:0 error: nil];

したがって、dataWithJSONObjectのディクショナリに入れるときは、他の「ブール値」/ブール値のような値-> @YES/@NOを有効にする必要があります。

[NSJSONSerialization dataWithJSONObject:@{@"test": (boolLikeValue ? @YES : @NO)} options:0 error: nil];
于 2014-03-04T21:41:10.667 に答える
5

はい、 kCFBooleanTrueおよびkCFBooleanFalseを使用して、NSJSONSerializationでブール値(true / false)を出力することができます。

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kCFBooleanTrue, @"key_1",
                           kCFBooleanFalse, @"key_2",
                           nil]  

それから

NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error];
于 2015-02-11T09:05:09.723 に答える
3

いいえ、BoolのFoundation ObjectはNSNumber numberWithBool、0または1になります。ObjectはありませんBool。同じように読んでJSONください。真/偽はNSNumber再びなります。

Boolクラスを作成して、独自のパーサーを作成できます。配列は配列であり、JSONオブジェクトはNSDictionaryです。キーを照会し、背後にあるクラスをテストして、これからJSON文字列を作成できます。

于 2012-11-28T22:51:50.250 に答える
1

NSNumberとしても保存されているCoreDataのブール値を使用しているときに、同様の問題が発生しました。私にとって最も簡単な解決策は@()を使用することでした:

[NSJSONSerialization dataWithJSONObject:@{@"bool": @([object.value boolValue])} options:0 error: nil];

@()はBOOL値を認識し、NSNumberをnumberWithBoolで初期化すると思います:これはJSONでtrue/falseになります

于 2014-08-13T23:48:16.157 に答える
1

iOS9で問題が発生しました。私の場合、workout.privateCoreData処理のためにNSNumber*にブールマッピングされたCoreDataプロパティがあります。

JSONセットを作成する場合、JSON [NSNumber numberWithBool:workout.private.boolValue]でtrue / falseが期待されますが、workout.private@(workout.private.boolValue)は「1」または「0」を設定します。

于 2016-10-08T17:26:58.107 に答える