ios - jsonserialization - swiftyjson



ブール値をtrueまたはfalseとして出力するNSJSONSerializationを取得するにはどうすればよいですか? (4)

私はNSJSONSerializationのdataWithJSONObjectを使用してクラスをJSONにシリアル化しています。 BOOLを直列化すると、JSON文字列の値1または0が返されます。 代わりに真実か偽である必要があります。 これは一般的に可能ですか?


Answer #1

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

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

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

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

EDIT 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}

Answer #2

これが最良の答えであるかどうかは分かりませんが...

@YESまたは@NOを必ず使用してください。出力されたJSONにはtrue / falseが入ります:

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

したがって、dataWithJSONObjectのディクショナリに入れるときは、他の "ブール値" / boolean値を@YES / @ NOとする必要があります。

[NSJSONSerialization dataWithJSONObject:@{@"test": (boolLikeValue ? @YES : @NO)} options:0 error: nil];

Answer #3

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

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

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


Answer #4

私はiOS9でこの問題にヒットしました。 私の場合は、CoreDataの処理のためにboolがNSNumber *にマップされているCoreDataプロパティworkout.privateあることです。

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





boolean