diff --git a/src/components/ChatBot/MarkdownWithCharts.js b/src/components/ChatBot/MarkdownWithCharts.js index 0efdd1ec..6ae44607 100644 --- a/src/components/ChatBot/MarkdownWithCharts.js +++ b/src/components/ChatBot/MarkdownWithCharts.js @@ -240,6 +240,60 @@ export const MarkdownWithCharts = ({ content, variant = 'auto' }) => { // 移除可能的前后空白和不可见字符 cleanContent = cleanContent.replace(/^\s+|\s+$/g, ''); + // 检查 JSON 是否完整并尝试修复 + // 使用栈来跟踪括号,确保正确的闭合顺序 + const stack = []; + let inString = false; + let escape = false; + + for (let i = 0; i < cleanContent.length; i++) { + const char = cleanContent[i]; + + if (escape) { + escape = false; + continue; + } + + if (char === '\\' && inString) { + escape = true; + continue; + } + + if (char === '"') { + inString = !inString; + continue; + } + + if (inString) continue; + + if (char === '{' || char === '[') { + stack.push(char); + } else if (char === '}') { + if (stack.length > 0 && stack[stack.length - 1] === '{') { + stack.pop(); + } + } else if (char === ']') { + if (stack.length > 0 && stack[stack.length - 1] === '[') { + stack.pop(); + } + } + } + + // 如果栈不为空,说明有未闭合的括号,需要补全 + if (stack.length > 0) { + logger.warn('检测到不完整的 ECharts JSON,尝试修复', { + unclosed: stack.join(''), + }); + + // 按照栈的逆序补全闭合括号 + while (stack.length > 0) { + const open = stack.pop(); + cleanContent += open === '{' ? '}' : ']'; + } + + logger.info('ECharts JSON 已修复'); + } + // 尝试解析 JSON const chartOption = JSON.parse(cleanContent);