You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:42:37