使用Dio获取Web端JSON数据,如何跳过开头的)]}',无效字符
解决Dio读取带
)]},'前缀的JSON解析错误问题 我之前也踩过这个坑!后端返回的JSON开头带)]},'这种防XSS的前缀,会直接导致Dio的默认JSON解析报错,给你两个实用的解决思路:
方法一:全局拦截器统一处理(推荐)
这种方式一劳永逸,所有请求都会自动清理前缀,不用每个请求重复写逻辑:
// 自定义一个拦截器来处理前缀 class AntiXssInterceptor extends Interceptor { @override void onResponse(Response response, ResponseInterceptorHandler handler) { // 先处理可能的二进制数据(比如gzip压缩的响应) if (response.data is Uint8List) { response.data = utf8.decode(response.data as Uint8List); } // 检查响应是否是字符串且带目标前缀 if (response.data is String && (response.data as String).startsWith(')]}\',')) { // 截取掉前5个字符,得到纯净的JSON字符串 String cleanJson = (response.data as String).substring(5); response.data = cleanJson; } // 继续传递处理后的响应 super.onResponse(response, handler); } } // 给你的Dio实例添加这个拦截器 final dio = Dio(); dio.interceptors.add(AntiXssInterceptor()); // 之后正常发起请求即可 final response = await dio.get(url); // 现在解析JSON不会报错了 final jsonData = json.decode(response.data);
这个拦截器会在所有响应返回时自动处理,特别适合多个接口都带这个前缀的场景,不用每次都手动处理。
方法二:单个请求手动处理
如果只有个别接口有这个前缀,不想加全局拦截器,直接在请求后手动处理就行:
final response = await dio.get(url); // 先把响应转为字符串 String responseContent = response.data.toString(); // 检查并清理前缀 if (responseContent.startsWith(')]}\',')) { responseContent = responseContent.substring(5); } // 解析JSON final jsonData = json.decode(responseContent);
注意点
如果后端返回的是压缩后的响应(比如gzip),要确保Dio已经开启了自动解压(默认是开启的),如果没开启,记得在Dio初始化时设置:
dio.options.headers['Accept-Encoding'] = 'gzip';
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

