json-to-arr.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /**
  2. * json 结点:将 JSON 字符串解析为数组(如 img-url-json -> img-url-arr)
  3. * 对应 process:type: "json", method: "json-to-arr", inVars: ["{img-url-json}"], outVars: ["{img-url-arr}"]
  4. * 或统一写法:type: "fun", method: "json-to-arr", inVars / outVars 可省略
  5. */
  6. /**
  7. * 将 JSON 字符串解析为数组并返回,供后续 for 等使用。
  8. * @param {{ jsonString: string }} input - jsonString 为变量取值后的 JSON 字符串
  9. * @returns {{ success: boolean, result?: any[], error?: string }}
  10. */
  11. function normalizeAiJsonText(raw) {
  12. let s = typeof raw === 'string' ? raw.trim() : String(raw).trim()
  13. if (!s) return ''
  14. // 去掉行首行尾 markdown 围栏(含仅开头 ```json 的情况)
  15. s = s.replace(/^```(?:json)?\s*\r?\n?/i, '')
  16. s = s.replace(/\r?\n?```\s*$/i, '')
  17. s = s.trim()
  18. // 再取第一个 ```...``` 内层(模型有时前后还有说明文字)
  19. const inner = s.match(/```(?:json)?\s*([\s\S]*?)```/i)
  20. if (inner) s = inner[1].trim()
  21. // 弯引号、直角引号 → 标准双引号(避免 Unterminated string)
  22. s = s.replace(/[\u201c\u201d\u201e\u201f\u2033\u2036\u00ab\u00bb]/g, '"')
  23. s = s.replace(/[「」『』]/g, '"')
  24. // 截取从首个 [ 到最后一个 ],忽略模型输出的前后废话
  25. const lb = s.indexOf('[')
  26. const rb = s.lastIndexOf(']')
  27. if (lb !== -1 && rb > lb) s = s.slice(lb, rb + 1)
  28. return s.trim()
  29. }
  30. async function executeJsonToArr({ jsonString }) {
  31. if (jsonString == null) return { success: false, error: 'json-to-arr 缺少输入(如 inVars[0])' }
  32. let str = normalizeAiJsonText(jsonString)
  33. if (!str) return { success: false, error: 'json-to-arr 输入为空' }
  34. let parsed
  35. let lastErr
  36. try {
  37. parsed = JSON.parse(str)
  38. } catch (e) {
  39. lastErr = e
  40. // AI 可能截断:尝试补全后再解析
  41. if (str.startsWith('[')) {
  42. if (/^\[\s*"[^"]*$/.test(str)) {
  43. try { parsed = JSON.parse(str + '"]') } catch (_) {}
  44. }
  45. if (parsed == null && str.endsWith('"')) {
  46. try { parsed = JSON.parse(str + ']') } catch (_) {}
  47. }
  48. // 常见:只输出了一个带引号的串和逗号,第二个串未闭合
  49. if (parsed == null && /^\[\s*"[^"]*",\s*"[^"]*$/.test(str)) {
  50. try { parsed = JSON.parse(str + '"]') } catch (_) {}
  51. }
  52. }
  53. if (parsed == null) {
  54. return {
  55. success: false,
  56. error: `JSON 解析失败: ${lastErr && lastErr.message ? lastErr.message : String(lastErr)}(原始前 120 字: ${String(jsonString).slice(0, 120).replace(/\s+/g, ' ')})`,
  57. }
  58. }
  59. }
  60. const arr = Array.isArray(parsed) ? parsed : (parsed != null ? [parsed] : [])
  61. return { success: true, result: arr }
  62. }
  63. module.exports = { executeJsonToArr }