我如何让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立JSON
string。
当我创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];
是的,可以通过使用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];
我刚刚在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中的真/假