文本中提取JSON工具

This commit is contained in:
COOL 2025-04-22 11:26:57 +08:00
parent d6625792af
commit a7ab0747d1

View File

@ -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
}
}