Ios NSJSON序列化和SBJson工作异常
我多次尝试使用NSJSONSerialization和SBJsonWriter将同一个NSDictionary对象转换为NSData和NSString,有时会得到不同的字符串。甚至是空的。这很奇怪,我找不到任何理由=(JSONKit和YAJL没有这样的问题。 下面是我的测试代码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"
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]