json-to-arr.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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. async function executeJsonToArr({ jsonString }) {
  12. if (jsonString == null) return { success: false, error: 'json-to-arr 缺少输入(如 inVars[0])' }
  13. let str = typeof jsonString === 'string' ? jsonString.trim() : String(jsonString).trim()
  14. // 去掉可能的 markdown 代码块包裹
  15. const codeBlockMatch = str.match(/^```(?:json)?\s*([\s\S]*?)```\s*$/m)
  16. if (codeBlockMatch) str = codeBlockMatch[1].trim()
  17. if (!str) return { success: false, error: 'json-to-arr 输入为空' }
  18. let parsed
  19. try {
  20. parsed = JSON.parse(str)
  21. } catch (e) {
  22. // AI 可能截断:尝试补全后再解析
  23. if (str.startsWith('[')) {
  24. if (/^\[\s*"[^"]*$/.test(str)) {
  25. try { parsed = JSON.parse(str + '"]') } catch (_) {}
  26. }
  27. if (parsed == null && str.endsWith('"')) {
  28. try { parsed = JSON.parse(str + ']') } catch (_) {}
  29. }
  30. }
  31. if (parsed == null) {
  32. return { success: false, error: `JSON 解析失败: ${e && e.message ? e.message : String(e)}` }
  33. }
  34. }
  35. const arr = Array.isArray(parsed) ? parsed : (parsed != null ? [parsed] : [])
  36. return { success: true, result: arr }
  37. }
  38. module.exports = { executeJsonToArr }