将值为[NSNull null]的Dictionary转换为JSON

时间:2014-04-24 14:43:17

标签: ios objective-c json nsdictionary nsjsonserialization

我正在尝试使用此代码:

NSDictionary *innerMessage 
      = @{@"nonce":[NSNumber numberWithInteger:nonce],
          @"payload":@{@"login": [NSNull null]}};

NSError * err;
NSData * innerMessageData = [NSJSONSerialization 
     dataWithJSONObject:innerMessage options:0  
     error:&err];

使用以下结构创建JSON对象:

{
    "apikey": "e418f5b4a15608b78185540ef583b9fc",
    "signature": "FN6/9dnMfLh3wZj+cAFr82HcSvmwuniMQqUlRxSQ9WxRqFpYrjY2xlvDzLC5+qSZAHts8R7KR7HbjiI3SzVxHg==",
    "message":{
        "nonce": 12, 
        "payload": {
            "Login": {}
        }
    }
}

然而,这是我得到的实际结果:

{"nonce":1398350092512,"payload":{"login":null}}
  • 为什么我的词典中的[NSNull null]未转换为{}
  • 我如何更改代码以获取正确的JSON 结构

谢谢!

3 个答案:

答案 0 :(得分:3)

NSNull假设在JSON中成为null

如果您想在JSON({})中使用空字典,则应使用空字典 - @{}

答案 1 :(得分:1)

将代码更改为

NSDictionary *innerMessage = @{
                                   @"nonce":@12,
                                   @"payload":@{@"login": @{}}
                              };

NSError * err;
NSData * innerMessageData = [NSJSONSerialization 
     dataWithJSONObject:innerMessage options:0  
     error:&err];

这将创建所需的响应

{
    nonce = 12,
    payload =  {
        login = {}
    },
}

答案 2 :(得分:0)

null是一个完全有效的JSON值;你在期待什么? NSJSONSerialization应该如何知道您希望将[NSNull null]转换为空对象? (就此而言,为什么不将空值转换为空数组,空列表或数字零?)

解决方案是在序列化之前处理您的innerMessage,将[NSNull null]的所有实例替换为@{}(或等效地,[NSDictionary dictionary])。