wangzhibo
6 天以前 7dcc2997614f849258091f5d66e648317a40d323
src/comm/utils.ts
@@ -192,80 +192,4 @@
    // 如果 pattern 和 url 的部分数量一致,则匹配成功
    return patternParts.length === urlParts.length;
  }
  /**
   * 从文本中提取 JSON 字符串并转换为对象
   * @param {string} text - 可能包含 JSON 的文本
   * @returns {Object|Array|null} - 解析出的 JSON 对象,如果没有找到有效 JSON 则返回 null
   */
  extractJSONFromText(text) {
    if (!text || typeof text !== 'string') {
      return null;
    }
    try {
      // 尝试直接解析整个文本
      return JSON.parse(text);
    } catch (e) {
      // 整个文本不是有效的 JSON,尝试提取 JSON 部分
    }
    // 查找可能的 JSON 开始位置({ 或 [)
    const possibleStarts = [];
    for (let i = 0; i < text.length; i++) {
      if (text[i] === '{' || text[i] === '[') {
        possibleStarts.push(i);
      }
    }
    // 从每个可能的起始位置尝试提取 JSON
    for (const startIndex of possibleStarts) {
      let openBraces = 0;
      let openBrackets = 0;
      let inString = false;
      let escapeNext = false;
      for (let i = startIndex; i < text.length; i++) {
        const char = text[i];
        // 处理转义字符
        if (inString && !escapeNext && char === '\\') {
          escapeNext = true;
          continue;
        }
        // 处理字符串边界
        if (!escapeNext && char === '"') {
          inString = !inString;
        }
        if (!inString) {
          // 只在不在字符串内部时才计算括号
          if (char === '{') openBraces++;
          else if (char === '}') openBraces--;
          else if (char === '[') openBrackets++;
          else if (char === ']') openBrackets--;
        }
        escapeNext = false;
        // 检查是否找到了完整的 JSON 结构
        if (
          (openBraces === 0 && text[startIndex] === '{' && char === '}') ||
          (openBrackets === 0 && text[startIndex] === '[' && char === ']')
        ) {
          const jsonStr = text.substring(startIndex, i + 1);
          try {
            const result = JSON.parse(jsonStr);
            return result;
          } catch (e) {
            // 这个候选 JSON 无效,继续尝试下一个
            break;
          }
        }
      }
    }
    return null; // 没有找到有效的 JSON
  }
}