iOS开发:JSON解析遇到特殊字符处理方法

特殊情况下服务端返回的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];
}

你可能感兴趣的:(iOS开发:JSON解析遇到特殊字符处理方法)