优化 ExternalToolEditor 的 JSON 解析逻辑,支持更宽松的对象格式(如无引号键值对)

main
sp mac bookpro 2605 2026-07-22 12:13:34 +08:00
parent bcb226c98b
commit 44dba476c4
1 changed files with 31 additions and 2 deletions

View File

@ -37,11 +37,11 @@ function parseJsonObject(value: string | undefined, fieldName: string, optional
} }
try { try {
// 优先尝试标准 JSON 解析 // 1. 优先尝试标准 JSON 解析
return JSON.parse(trimmedValue); return JSON.parse(trimmedValue);
} catch (e) { } catch (e) {
try { try {
// 失败后尝试作为 JS 对象解析 (支持无引号、单引号等) // 2. 失败后尝试作为 JS 对象解析 (支持无引号、单引号等)
// eslint-disable-next-line no-new-func // eslint-disable-next-line no-new-func
const parsed = new Function(`return (${trimmedValue})`)(); const parsed = new Function(`return (${trimmedValue})`)();
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
@ -49,6 +49,35 @@ function parseJsonObject(value: string | undefined, fieldName: string, optional
} }
throw new Error(); throw new Error();
} catch (e2) { } catch (e2) {
// 3. 尝试宽松解析 (处理类似 { Content-Type: application/json } 这种完全无引号的情况)
try {
const content = trimmedValue.replace(/^\{/, '').replace(/\}$/, '').trim();
const result: Record<string, any> = {};
const pairs = content.split(/[\n,]/);
let hasValidPair = false;
for (let pair of pairs) {
pair = pair.trim();
if (!pair) continue;
const colonIndex = pair.indexOf(':');
if (colonIndex > 0) {
const k = pair.substring(0, colonIndex).trim().replace(/^['"]|['"]$/g, '');
const v = pair.substring(colonIndex + 1).trim().replace(/^['"]|['"]$/g, '');
if (k) {
let finalVal: any = v;
if (v === 'true') finalVal = true;
else if (v === 'false') finalVal = false;
else if (v === 'null') finalVal = null;
else if (!isNaN(Number(v)) && v !== '') finalVal = Number(v);
result[k] = finalVal;
hasValidPair = true;
}
}
}
if (hasValidPair) return result;
} catch (e3) {
// ignore and fall through to error
}
throw new Error(`${fieldName}格式不正确,请确保是有效的 JSON 或对象格式`); throw new Error(`${fieldName}格式不正确,请确保是有效的 JSON 或对象格式`);
} }
} }