代码
NSDictionary *dic = @{@"url": @"http://..."};
NSLog(@"%@", dic);
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"%@", jsonString);
执行结果:
2014-06-12 14:44:19.427 main[64877:1322484] {
url = "http://...";
}
2014-06-12 14:44:19.429 main[64877:1322484] {
"url" : "http:\/\/..."
}
转换后的json字符串中url地址被转义了 :(
使用字符串替换可以事后弥补:
[jsonString stringByReplacingOccurrencesOfString:@"\\" withString:@""];
如何事先预防呢?
PS:在和UIWebView进行js调用时需要不转义的json字符串,所以还是希望正面解决掉。
PHP中文网2017-04-22 09:01:59
This does not need to be processed, just use it directly.
If it is taken out directly and displayed on the Label, it will be escaped internally. So don't bother.
You can refer to the blog I wrote "IOS 7 uses the system's own library to perform POST JSON asynchronous access operations"
PHPz2017-04-22 09:01:59
About 是否应该转义成
/
, 我并没细究. 但是很多开源实现 decode 的时候是不会将/
转回 in the json standard document. Therefore, I don’t agree with the point of view mentioned above. In some cases, it must be processed, but I don’t know the official NSJSONSerialization processing method, so I switched to the open source jsonkit to bypass this problem
伊谢尔伦2017-04-22 09:01:59
Apple is so capricious, please replace it manually, similar to:
NSDictionary *policy = ....;
NSData *policyData = [NSJSONSerialization dataWithJSONObject:policy options:kNilOptions error:&error];
if(!policyData && error){
NSLog(@"Error creating JSON: %@", [error localizedDescription]);
return;
}
//NSJSONSerialization converts a URL string from http://... to http:\/\/... remove the extra escapes
policyStr = [[NSString alloc] initWithData:policyData encoding:NSUTF8StringEncoding];
policyStr = [policyStr stringByReplacingOccurrencesOfString:@"\/" withString:@"/"];
policyData = [policyStr dataUsingEncoding:NSUTF8StringEncoding];
See:
how to prevent NSJSONSerialization from adding extra escapes in URL
NSJSONSerialization serialization of a string containing forward slashes / and HTML is escaped incorrectly