28

我正在使用 NSJSONSerialization dataWithJSONObject 将我的类序列化为 JSON。当它序列化一个 BOOL 时,它会在 JSON 字符串中为其提供值 1 或 0。我需要这是真或假。这可以通用吗?

4

6 回答 6

30

当我创建[NSNumber numberWithBool:NO]时,NSJSONSerialization 在 JSON 字符串中返回单词“false”。

编辑使用新的快捷方式,您还可以使用这些方便的人:

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

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

编辑二

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}
于 2013-06-21T11:59:07.417 回答
15

我自己也遇到过这个问题,不确定这是否是最好的答案,但是......

确保使用@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];
于 2014-03-04T21:41:10.667 回答
5

Yes, it is possible to output a boolean (true/false) with NSJSONSerialization by using kCFBooleanTrue and kCFBooleanFalse :

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kCFBooleanTrue, @"key_1",
                           kCFBooleanFalse, @"key_2",
                           nil]  

then

NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error];
于 2015-02-11T09:05:09.723 回答
3

不,Bool 的基础对象是NSNumber numberWithBool,它变为 0 或 1。我们没有Bool对象。读书也一样JSON。True/false 将NSNumber再次变为 a。

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

于 2012-11-28T22:51:50.250 回答
1

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

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

我猜@() 确实可以识别 BOOL 值并使用 numberWithBool: 初始化 NSNumber:这会导致 JSON 中的真/假

于 2014-08-13T23:48:16.157 回答
1

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

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

于 2016-10-08T17:26:58.107 回答