问题描述
代码
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字符串,所以还是希望正面解决掉。
标题文字问题解答
回答1:这个不需要做处理的,直接用就是了。如果直接取出来显示在 Label 上,内部做过转义的。所以无需理会。可以参看我写的博客《IOS 7 利用系统自带库进行 POST JSON 异步访问操作》
回答2:关于 json 标准文档中 是否应该转义成/, 我并没细究. 但是很多开源实现 decode 的时候是不会将/转回的. 因此我并不同意楼上说的观点, 某些情况下必须要处理, 但我不知道官方NSJSONSerialization的处理方法, 所以改用开源的 jsonkit 绕开了这个问题
回答3:苹果就是这么任性手动替换一下吧类似:
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 escapespolicyStr = [[NSString alloc] initWithData:policyData encoding:NSUTF8StringEncoding];policyStr = [policyStr stringByReplacingOccurrencesOfString:@'/' withString:@'/'];policyData = [policyStr dataUsingEncoding:NSUTF8StringEncoding];
参见:how to prevent NSJSONSerialization from adding extra escapes in URLNSJSONSerialization serialization of a string containing forward slashes / and HTML is escaped incorrectly