【问题标题】:How do I get NSJSONSerialization to output a boolean as true or false?如何让 NSJSONSerialization 将布尔值输出为真或假?
【发布时间】:2012-11-16 22:00:08
【问题描述】:

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

【问题讨论】:

    标签: ios json boolean


    【解决方案1】:

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

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

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

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

    编辑二

    mbi 在 cmets 中指出 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}
    

    【讨论】:

    • 这里的iOS版本之间有一点警告!此代码[NSJSONSerialization dataWithJSONObject:@{ @"Test1" : @YES, @"Test2" : @(YES), @"Test3" : @true, @"Test4" : @(true) } options:nil error:nil] 在 iOS 9 {"Test4":true,"Test3":true,"Test2":true,"Test1":true} 上生成此 json,但在 iOS 8 及更低版本{"Test4":1,"Test3":1,"Test2":true,"Test1":true} 上生成此 json@
    • 有趣...感谢您的观察!
    • 不,我没看到。我会删除我的评论。谢谢指出!
    【解决方案2】:

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

    请务必使用@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];
    

    【讨论】:

    • 我发现这很有帮助,因为并非总是可以直接使用文字。例如在接收BOOL 参数的函数中,您需要将原语BOOL 转换为可确认的@BOOL 文字`@YES` 和@NO
    【解决方案3】:

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

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

    然后

    NSError *error = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:kNilOptions error:&error];
    

    【讨论】:

      【解决方案4】:

      不,Bool 的基础对象是 NSNumbernumberWithBool,它变为 0 或 1。我们没有 Bool 对象。同样去阅读JSON。 True/false 将再次变为NSNumber

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

      【讨论】:

      • 谢谢,我创建了自己的 JSONBool 类并且能够让它像那样工作
      • @TritonMan 介意在 JSONBool 类中发布更多代码吗?试图完成同样的事情。
      • 是的,多年来 NSJSONSerialization 的工作方式发生了变化。请注意提出和回答此问题的日期。
      • @Julian 在下面用[NSNumber numberWithBool:NO] 的回答现在要简单得多
      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 2020-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 1970-01-01
          • 1970-01-01
          • 2021-05-29
          相关资源
          最近更新 更多