特殊情况下服务端返回的JSON数据会包含制表符(\t)、换行符(\r)、回车(\n),这样的JSON数据直接解析会出错。
Domain=NSCocoaErrorDomain Code=3840 "Unescaped control character around character ***
1. 出错的原因
个人认为因为转义字符是特殊符号,既不是ASCII,又是固定格式不能进行编码,所以NSJSONSerialization不能处理转义字符。
2. 解决方案
根据使用场景有不同的处理方式
不需要显示格式时
直接遍历字符串,找到转义字符,删除掉。需要在页面中用到换行、制表符等格式时
同样遍历字符串,找到转义字符,加反斜杠。
3. Demo代码
- (NSData*)washResponseData:(NSData *)data
{
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSMutableString *jsonString = [NSMutableString stringWithString:responseString];
NSString *character = nil;
for (int i = 0; i < jsonString.length; i ++) {
character = [jsonString substringWithRange:NSMakeRange(i, 1)];
//只判断常见的转义字符,有需求可以再加
if ([character isEqualToString:@"\t"] || [character isEqualToString:@"\n"] || [character isEqualToString:@"\r"]) {
//方案1
[jsonString deleteCharactersInRange:NSMakeRange(i, 1)];
//方案2
//NSString *replaceString = [NSString stringWithFormat:@"\\%@",character];
//[jsonString replaceCharactersInRange:NSMakeRange(i, 1) withString:replaceString];
}
}
return [jsonString dataUsingEncoding:NSUTF8StringEncoding];
}