From a7ab0747d108ec614a058cc1fe1392d3b245177c Mon Sep 17 00:00:00 2001 From: COOL Date: Tue, 22 Apr 2025 11:26:57 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E6=9C=AC=E4=B8=AD=E6=8F=90=E5=8F=96JS?= =?UTF-8?q?ON=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/comm/utils.ts | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/src/comm/utils.ts b/src/comm/utils.ts index 87b438d..e50b3b8 100644 --- a/src/comm/utils.ts +++ b/src/comm/utils.ts @@ -192,4 +192,80 @@ export class Utils { // 如果 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 + } }