NSJSONSerialization 和 SBJson 工作异常

Posted

技术标签:

【中文标题】NSJSONSerialization 和 SBJson 工作异常【英文标题】:NSJSONSerialization and SBJson work oddly 【发布时间】:2012-04-24 16:37:46 【问题描述】:

我尝试过多次使用 NSJSONSerialization 和 SBJsonWriter 将相同的 NSDictionary 对象转换为 NSData 和 NSString,但有时会得到不同的字符串。甚至为空。这很奇怪,我找不到任何理由。 =( JSONKit 和 YAJL 没有这样的问题。 以下是我的测试代码。

for (int i = 0; i < 5; i++) 
  NSDictionary *d = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"];
  NSData *data = [NSJSONSerialization dataWithJSONObject:d options:0 error:nil];
  NSLog(@"%@", [NSString stringWithUTF8String:data.bytes]);

控制台输出是...

2012-04-25 01:35:33.113 Test[19347:c07] "key":"value"
2012-04-25 01:35:33.114 Test[19347:c07] (null)
2012-04-25 01:35:33.114 Test[19347:c07] "key":"value"
2012-04-25 01:35:33.114 Test[19347:c07] "key":"value"
2012-04-25 01:35:33.115 Test[19347:c07] (null)

每次我运行测试代码时输出都会发生变化。 data 的字节大小相同,但 UTF8 转换的字符串长度不同。

【问题讨论】:

【参考方案1】:

NSData 对象中的字节不一定包含以 NUL 结尾的字符串。如果您想将数据转换为 NSString,请改为:

[[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding]

为了安全起见,某些解析器可能会将 '\0' 写入它们返回的数据的末尾,这解释了为什么它们的行为更具可预测性。但正如您所见,您不应该依赖这种行为。

【讨论】:

好答案!我刚刚运行了 OP 的代码,并且绝对认为你是正确的。 NSData 每次都以相同的方式创建,而 NSString 的创建失败。大概在那些情况下,当它工作时超出数据末尾的字节恰好是\0 确实,我怀疑在 stringWithUTF8String: 返回 nil 的情况下,它已经看到了无效的 UTF-8 字节序列和保释,这是正确的行为。 听起来是个合理的解释。

以上是关于NSJSONSerialization 和 SBJson 工作异常的主要内容,如果未能解决你的问题,请参考以下文章

怎么将一个表的字段更新为另一个表的值

NSJSONSerialization 不更新数据

NSJSONSerialization 包含正斜杠的字符串序列化 / 和 HTML 被错误地转义

NSJSONSerialization 与基于流的解析器

为啥 NSJSONSerialization 将 NSDictionary 错误地解析为 JSON?

NSJSONSerialization 与 C# Rest 服务