{"version":3,"sources":["../src/object/safeParseJson.ts"],"names":["addLineCommaRegex","strVarRegex","badKeyRegex","safeParseJson","str","callback","key","value","resultStr","match","offset","string","before","after","s","begin","p1","p2"],"mappings":";;;;AAUA,IAAMA,CAAoB,CAAA,MAAA,CAGpBC,CAAc,CAAA,mBAAA,CAEdC,EAAc,4BAYb,CAAA,SAASC,CAAcC,CAAAA,CAAAA,CAAaC,EAA6C,CAEvF,GAAI,CACH,OAAO,KAAK,KAAMD,CAAAA,CAAAA,CAAK,CAACE,CAAAA,CAAKC,CACxBF,GAAAA,CAAAA,CACIA,CAASC,CAAAA,CAAAA,CAAKC,CAAK,CAEpBA,CAAAA,CACP,CACF,CAAA,KAAQ,EAER,IAAIC,CAAYJ,CAAAA,CAAAA,CAAI,QAAQJ,CAAmB,CAAA,CAACS,CAAOC,CAAAA,CAAAA,CAAQC,CAAW,GAAA,CAEzE,IAAMC,CAAAA,CAASD,EAAO,KAAM,CAAA,CAAA,CAAGD,CAAM,CAAA,CAAE,MACjCG,CAAAA,CAAAA,CAAQF,CAAO,CAAA,KAAA,CAAMD,EAAS,CAAC,CAAA,CAAE,IAAK,EAAA,CAC5C,OAAI,CAAC,IAAK,CAAA,IAAA,CAAKE,CAAM,CAAK,EAAA,CAAC,WAAY,CAAA,IAAA,CAAKA,CAAM,CAAK,EAAA,CAAC,KAAM,CAAA,IAAA,CAAKC,CAAK,CAChE,CAAA,CAAA;AAAA,CAED,CAAA;AAAA,CACR,CAAC,CAAA,CAGD,OAAAL,CAAAA,CAAYA,CAAU,CAAA,UAAA,CAAWP,CAAa,CAAA,CAACa,CAAGC,CAAAA,CAAAA,CAAOR,CACjD,GAAA,CAAA,CAAA,EAAI,UAAUA,CAAK,CAAC,CAC3B,CAAA,CAAA,CAAA,CAGDC,CAAYA,CAAAA,CAAAA,CAAU,UAAWN,CAAAA,CAAAA,CAAa,CAACY,CAAGE,CAAAA,CAAAA,CAAIV,CAAKW,CAAAA,CAAAA,GACnD,CAAGD,EAAAA,CAAE,CAAIV,CAAAA,EAAAA,CAAG,IAAIW,CAAE,CAAA,CACzB,CAGDT,CAAAA,CAAAA,CAAYA,CAAU,CAAA,UAAA,CAAW,QAAK,CAAA,GAAG,EAAE,UAAW,CAAA,QAAA,CAAK,GAAG,CAAA,CAAE,UAAW,CAAA,QAAA,CAAK,GAAG,CAAA,CAG5E,KAAK,KAAMA,CAAAA,CAAAA,CAAW,CAACF,CAAAA,CAAKC,CAC9B,IAAA,OAAOA,CAAS,EAAA,QAAA,GAAUA,EAAQ,SAAUA,CAAAA,CAAK,CACjDF,CAAAA,CAAAA,CAAAA,CACIA,CAASC,CAAAA,CAAAA,CAAKC,CAAK,CAAA,CAEpBA,EACP,CACF","file":"chunk-AIHX7KEE.mjs","sourcesContent":["/**\r\n *   使用正则表达式解析非标JOSN\r\n *\r\n */\r\n\r\n// 匹配键名和值不规范的JSON字符串\r\n// //const badJsonRegex = /(\\s*[\\w\\u4e00-\\u9fa5]+\\s*(?=:))|((?=:\\s*)\\'.*\\')|(\\'.*?\\'(?=\\s*:))|((?<=:\\s*)\\'.*?\\')/gm\r\n// const badJsonRegex =/(\\s*[\\w\\u4e00-\\u9fa5]+\\s*(?=:))|((?=:\\s*)\\'.*\\')|(\\'.*?\\'(?=\\s*:))|((?<=:\\s*)\\'.*?\\')|((?<=,|\\[\\s*)\\'.*?\\')/gm\r\n\r\n// 匹配未添加逗号的行\r\nconst addLineCommaRegex = /\\n/gm;\r\n\r\n// 匹配使用\"\"或''包裹字符串\r\nconst strVarRegex = /([\"'])(.*?)(\\1)/gm;\r\n// 匹配没有使用 \"\" 包裹的 key\r\nconst badKeyRegex = /([\\s\\[\\,\\{])(\\w+)(\\s*\\:)/gm;\r\n\r\n/**\r\n * 解析非标准的 JSON 字符串\r\n * 非标准的 JSON 字符串指的是：\r\n *  - key 没有使用 \"\" 包裹\r\n *  - 字符串 value 没有使用 \"\" 包裹\r\n *\r\n * @param {*} str\r\n * @param {(key: string, value: any) => any} [callback] - 可选回调函数，用于自定义解析\r\n * @returns {any} 解析后的对象\r\n */\r\nexport function safeParseJson(str: string, callback?: (key: string, value: any) => any) {\r\n\t// 先尝试解析一个JSON字符串，如果解析失败，再尝试进行修复\r\n\ttry {\r\n\t\treturn JSON.parse(str, (key, value) => {\r\n\t\t\tif (callback) {\r\n\t\t\t\treturn callback(key, value);\r\n\t\t\t}\r\n\t\t\treturn value;\r\n\t\t});\r\n\t} catch {}\r\n\t// 1. 如果行未添加逗号，添加逗号\r\n\tlet resultStr = str.replace(addLineCommaRegex, (match, offset, string) => {\r\n\t\t// 判断前面和后面的字符，是否需要添加逗号\r\n\t\tconst before = string.slice(0, offset).trim();\r\n\t\tconst after = string.slice(offset + 1).trim();\r\n\t\tif (!/,$/.test(before) && !/[\\[\\{\\}]$/.test(before) && !/^\\}/.test(after)) {\r\n\t\t\treturn ',\\n';  // 需要逗号\r\n\t\t}\r\n\t\treturn '\\n';  // 保持原换行\r\n\t});\r\n\r\n\t// 2. 匹配使用 \"\" 或 '' 包裹的字符串，全部编码以防止后继正则出错\r\n\tresultStr = resultStr.replaceAll(strVarRegex, (s, begin, value) => {\r\n\t\treturn `\"${encodeURI(value)}\"`;\r\n\t});\r\n\r\n\t// 3. 将没有用 \"\" 包裹的 key 全部加上 \"\"\r\n\tresultStr = resultStr.replaceAll(badKeyRegex, (s, p1, key, p2) => {\r\n\t\treturn `${p1}\"${key}\"${p2}`;\r\n\t});\r\n\r\n\t// 4. 将全角字符转换为半角字符，容错处理\r\n\tresultStr = resultStr.replaceAll(\"，\", \",\").replaceAll(\"“\", '\"').replaceAll(\"”\", '\"');\r\n\r\n\t// 尝试再次解析修复后的 JSON 字符串\r\n\treturn JSON.parse(resultStr, (key, value) => {\r\n\t\tif (typeof value == \"string\") value = decodeURI(value);\r\n\t\tif (callback) {\r\n\t\t\treturn callback(key, value);\r\n\t\t}\r\n\t\treturn value;\r\n\t});\r\n}\r\n"]}