如何处理XMLHttpRequest返回的两种格式HTTP响应结果?
解决XMLHttpRequest响应字符串的动态解析问题
问题核心:当responseText是普通字符串(如"akduchkqlpouelqw")时,直接调用JSON.parse()会抛出语法错误,导致后续的类型判断代码根本不会执行,自然进不了typeof objToken === 'string'分支。
解决方案:用try-catch包裹JSON解析逻辑
通过捕获解析失败的异常,区分两种响应类型:
- 解析成功:说明是JSON格式字符串,处理解析后的对象
- 解析失败:说明是普通字符串,直接处理原
responseText
修改后的代码如下:
var xhr = new XMLHttpRequest(); xhr.addEventListener("readystatechange", function() { if(this.readyState === 4) { if(this.responseText.length > 0) { const textToken = this.responseText; let parsedResult; try { // 尝试解析为JSON parsedResult = JSON.parse(textToken); // 解析成功,处理对象类型(排除null,因为typeof null返回'object') if(typeof parsedResult === 'object' && parsedResult !== null) { // 你的对象处理逻辑 } } catch (e) { // 解析失败,说明是普通字符串 // 你的普通字符串处理逻辑 } } else { // 空响应处理逻辑 } } });
补充场景处理
如果你的普通字符串有可能是带双引号的合法JSON字符串(如"\"valid-string\""),解析后会得到字符串类型,这时候可以在try块里再增加一层判断:
try { parsedResult = JSON.parse(textToken); if(typeof parsedResult === 'object' && parsedResult !== null) { // 处理JSON对象 } else if(typeof parsedResult === 'string') { // 处理解析后得到的合法字符串类型 } } catch (e) { // 处理无法解析的纯普通字符串 }
内容的提问来源于stack exchange,提问作者Manuel Yerbes
相关产品推荐
相关产品推荐

