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

Tri*_*Man 27 json boolean ios

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

Jul*_*ert 26

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

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

@(YES) /   @(NO)
@(1)   /   @(0)
@YES   /   @NO
@1     /   @0
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以避免循环使用您的值.我想要完全相反的行为,但有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}
Run Code Online (Sandbox Code Playgroud)

  • iOS版本之间有一点警告!这段代码`[NSJSONSerialization dataWithJSONObject:@ {@"Test1":@ YES,@"Test2":@(YES),@"Test3":@ true,@"Test4":@(true)}选项:nil错误: nil]`在iOS 9上生成这个json` {"Test4":true,"Test3":true,"Test2":true,"Test1":true}`但是在iOS 8及以下`{"Test4"下生成这个json :1, "Test3的":1, "Test2的":真实的, "测试1":真正}` (5认同)

jar*_*ker 14

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

确保使用@YES或@NO,然后输出的json将包含true/false:

[NSJSONSerialization dataWithJSONObject:@{@"test": @YES} options:0 error: nil];
Run Code Online (Sandbox Code Playgroud)

所以当你放入dataWithJSONObject的字典时,你将不得不转换你的其他"布尔值"/布尔值 - > @YES/@NO.

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


小智 5

是的,可以通过使用kCFBooleanTruekCFBooleanFalse使用NSJSONSerialization输出布尔值(真/假):

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:kCFBooleanTrue, @"key_1",
                           kCFBooleanFalse, @"key_2",
                           nil]  
Run Code Online (Sandbox Code Playgroud)

然后

NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error];
Run Code Online (Sandbox Code Playgroud)


Hel*_*ker 3

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

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

  • 谢谢,我创建了自己的 JSONBool 类并能够让它像那样工作 (2认同)