Ios NSJSON序列化和SBJson工作异常

Ios NSJSON序列化和SBJson工作异常,ios,json,sbjson,Ios,Json,Sbjson,我多次尝试使用NSJSONSerialization和SBJsonWriter将同一个NSDictionary对象转换为NSData和NSString,有时会得到不同的字符串。甚至是空的。这很奇怪,我找不到任何理由=(JSONKit和YAJL没有这样的问题。 下面是我的测试代码 for (int i = 0; i < 5; i++) { NSDictionary *d = [NSDictionary dictionaryWithObject:@"value" forKey:@"key"

我多次尝试使用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]);
}
每次运行测试代码时,输出都会更改。
数据的字节大小相同,但UTF8转换的字符串长度不同。

NSData对象中的字节不一定包含以NUL结尾的字符串。如果要将数据转换为
NSString
,请执行以下操作:

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

有些解析器可能会在返回的数据末尾写入“\0”以确保安全,这就解释了为什么它们的行为更容易预测。但正如您所看到的,您不应该依赖于这种行为。

回答得好!我刚刚玩了一个游戏,运行OP的代码,并且肯定认为您是正确的。
NSData
是完全相同的每次都是如此,而创建
NSString
失败了。可能在这种情况下,当它工作时,超出数据末尾的字节恰好是
\0
。事实上,我怀疑在
stringWithUTF8String:
返回nil的情况下,它看到了无效的UTF-8字节序列并将其清除这是一个合理的解释。
[[NSString alloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding]