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

时间:2012-11-28 22:21:09

标签: ios json boolean

我正在使用NSJSONSerialization dataWithJSONObject将我的类序列化为JSON。当它序列化BOOL时,它在JSON字符串中给它赋值1或0。我需要这是真或假。这可能一般吗?

6 个答案:

答案 0 :(得分:25)

当我创建[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}

答案 1 :(得分:13)

我自己跑过去,不确定这是不是最好的答案,但是......

确保使用@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];

答案 2 :(得分:3)

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

您可以创建一个Bool类并构建自己的解析器。数组是数组,JSON对象是NSDictionary。您可以查询键,测试后面的类,并从中构建JSON字符串。

答案 3 :(得分:3)

是的,可以使用 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];

答案 4 :(得分:1)

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

创建JSON时 [NSNumber numberWithBool:workout.private.boolValue]在JSON中设置了预期的true / false,但只有workout.private或@(workout.private.boolValue)设置为“1”或“0”。

答案 5 :(得分:0)

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

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

我猜@()确实识别BOOL值并使用numberWithBool初始化NSNumber:这导致JSON中的true / false