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

JavaScript替换\"为"及JSON解析TypeError报错求助

解决jQuery处理XHR获取的JSON时报错的问题

这个报错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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:54:44