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