jQuery与Axios请求非标准JSON的响应差异及适配方案
两者响应处理逻辑差异
- jQuery
$.ajax配置dataType: "json"时,解析逻辑更宽松:如果标准JSON.parse解析失败,会自动降级为使用JS执行的方式解析内容,所以支持不带双引号的key、内联JS表达式(比如示例中的Date.UTC调用)这类不符合JSON规范但符合JS对象字面量规则的内容,直接返回可用的JS对象。 - Axios的默认解析逻辑是严格的:仅当响应头的
Content-Type为application/json时,才会调用标准JSON.parse解析响应内容。而JSON.parse不允许任何不符合JSON规范的写法,既不接受无引号的key,也不能执行JS函数表达式,所以不仅不会自动解析为对象,手动调用JSON.parse也会直接抛出错误。
实现Axios和jQuery同等效果的方案
因为你不需要修改后端微进程的输出,最简单的方案是模拟jQuery的宽松解析逻辑,使用new Function执行返回的字符串来得到JS对象,该方案仅适用于你完全信任响应内容的场景(内部服务输出无恶意代码)。
单请求处理示例
axios({ method: 'post', url: dataURL, // Axios会自动序列化JS对象为JSON,无需手动调用JSON.stringify data: this.state.user, headers: { 'Content-Type': 'application/json' } }).then((res) => { // 自定义宽松解析逻辑 const customParse = (rawStr) => new Function(`return ${rawStr}`)() const returnedData = customParse(res.data) // 后续和jQuery中一样处理returnedData即可 console.log(returnedData) })
全局统一处理(多场景复用)
如果有多个这类接口,可以配置Axios响应拦截器,全局自动处理这类非标准格式响应:
// 在Axios初始化位置添加拦截器 axios.interceptors.response.use((response) => { // 匹配你需要处理的非标准JSON接口的路径规则,避免影响其他标准接口 if (response.config.url.startsWith('/your-custom-json-api/')) { try { // 优先尝试标准JSON解析,兼容后续可能的后端规范改造 return JSON.parse(response.data) } catch (err) { // 解析失败则使用宽松逻辑 return new Function(`return ${response.data}`)() } } return response })
内容的提问来源于stack exchange,提问作者BlindToMLAgainstTheWorld
相关产品推荐
相关产品推荐

