JavaScript替换\"为"及JSON解析TypeError报错求助
这个报错Uncaught TypeError: Cannot use 'in' operator to search for 'length' in [...]我碰到过好多次,本质原因很明确:你用jQuery处理的不是解析好的JSON对象,而是还带着转义问题的字符串。硬编码没问题是因为你直接写的是合法的JSON结构,而通过XHR拿到的是经过服务器转义(比如HTML实体转义)的文本,导致jQuery把它当成普通字符串去遍历,自然就触发错误了。
一步步解决问题
1. 先确认你拿到的数据类型
先在XHR的回调里加一行日志,看看拿到的内容到底是什么:
xhr.onload = function() { console.log(typeof this.responseText); // 大概率会输出string console.log(this.responseText); // 看看是不是带着\"这类转义字符 };
如果输出是string,说明浏览器没自动解析JSON,要么是服务器没设置正确的响应头,要么是返回的内容有转义异常。
2. 清理转义并解析JSON
你提到的\"是HTML实体"又被转义了一次的结果,需要先把它还原成正常的双引号,再解析成JSON对象:
xhr.onload = function() { let rawText = this.responseText; // 全局替换所有的\"为" let cleanedText = rawText.replace(/\\"/g, '"'); // 如果是直接的"(没有前面的\),就换成这个替换规则 // let cleanedText = rawText.replace(/"/g, '"'); try { let jsonData = JSON.parse(cleanedText); // 现在可以正常用jQuery处理了 $.each(jsonData, function(index, item) { console.log(item.day, item.periods); }); } catch (error) { console.error("JSON解析失败,先检查清理后的文本:", cleanedText); console.error(error); } };
3. 从根源解决:让服务器返回正确的JSON
如果能修改服务器端,最好让它设置正确的响应头Content-Type: application/json; charset=utf-8,这样浏览器会自动把XHR的响应解析成JSON对象,你直接用xhr.response就能拿到对象,根本不需要手动处理转义:
xhr.onload = function() { let jsonData = this.response; // 直接就是JSON对象 $.each(jsonData, function(index, item) { // 正常处理数据即可 }); };
为什么硬编码没问题?
硬编码的时候你写的[{"day":0,"periods":["0xffffffffffff"]}]在JS里本身就是一个数组对象,jQuery可以直接遍历。但通过XHR拿到的是字符串形式的"[{\"day\":0,\"periods\":[\"0xffffffffffff\"]}]"(或者带HTML转义的版本),如果不解析直接传给jQuery,它会把字符串当成遍历目标,尝试用in找length属性,这就触发了你看到的错误。
内容的提问来源于stack exchange,提问作者Acuario

