我如何让NSJSONSerialization输出一个布尔值为true或false?

我使用NSJSONSerialization的dataWithJSONObject将我的类序列化为JSON。 当它序列化一个布尔,它给它的JSONstring中的值1或0。 我需要这是真实的还是错误的。 这一般可以做到吗?

不,Bool的基础对象是NSNumber numberWithBool ,它变成0或1.我们没有Bool对象。 同样去阅读JSON 。 真/假将再次成为NSNumber

你可以创build一个Bool类并构build你自己的parsing器。 数组是数组,而JSON对象是NSDictionary 。 你可以查询关键字,testing什么类的后面,并从中build立JSONstring。

当我创build[NSNumber numberWithBool:NO] ,NSJSONSerialization在JSONstring中返回单词“false”。

编辑使用新的快捷键,你也可以使用这些方便的家伙:

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

这样你可以避免像循环你的值。 我想要完全相反的行为,但有NSNumber对象。 所以我必须循环…

编辑II

mbi在评论中指出,iOS版本之间存在差异。 所以这里是一个iOS9testing:

 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} 

只是碰到这个自己,不知道这是最好的答案,但…

确保使用@YES或@NO,那么你输出的json将会有true / false:

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

所以你将不得不把你的其他“布尔值”/布尔类似的值 – > @YES / @NO放入到dataWithJSONObject字典。

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

是的,可以通过使用kCFBooleanTruekCFBooleanFalse来输出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]; 

我刚刚在iOS9上遇到了这个问题。 我的情况是,我有一个CoreData属性workout.private ,由于CoreData处理bool映射到NSNumber *。

当创buildJSON [NSNumber numberWithBool:workout.private.boolValue]在JSON中设置预期的真/假,但只是workout.private或@(workout.private.boolValue)设置“1”或“0”。

我遇到类似的问题,当使用CoreData的布尔值,它也存储为NSNumber。 对我来说最简单的解决scheme是使用@():

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

我猜@()不承认BOOL值,并用numberWithBool初始化NSNumber:这导致在JSON中的真/假