mirror of
https://github.com/cool-team-official/cool-admin-midway.git
synced 2025-12-10 16:12:50 +00:00
文本中提取JSON工具
This commit is contained in:
parent
d6625792af
commit
a7ab0747d1
@ -192,4 +192,80 @@ export class Utils {
|
|||||||
// 如果 pattern 和 url 的部分数量一致,则匹配成功
|
// 如果 pattern 和 url 的部分数量一致,则匹配成功
|
||||||
return patternParts.length === urlParts.length;
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user