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 包含正斜杠的字符串序列化 / 和 HTML 被错误地转义