如何在JSON中添加ANSI颜色编码?转义字符报错如何解决
错误原因
JSON 规范里不支持\x格式的十六进制转义字符,仅支持\u开头的4位Unicode转义,或者\n、\\这类标准转义序列。你写的\x1B是JavaScript专属的十六进制转义写法,不符合JSON语法要求,所以会触发非法转义字符报错。
修复方案
方案1:替换为Unicode转义(推荐,无需改动原有JS代码)
\x1B对应的ASCII码为27,匹配的Unicode转义写法是\u001b,全局替换JSON里所有\x1B为\u001b即可,修改后合法的JSON内容如下:
{ "SYSTEM": { "SUCCESS": "[\u001b[48;2;0;0;0mSYSTEM\u001b[0m]::[\u001b[38;2;0;255;0m\u001b[48;2;0;0;0mSUCCESS\u001b[0m]", "RELOADED": "[\u001b[48;2;0;0;0mSYSTEM\u001b[0m]::[\u001b[38;2;0;255;0m\u001b[48;2;0;0;0mRELOADED\u001b[0m]", "RELOADING": "[\u001b[48;2;0;0;0mSYSTEM\u001b[0m]::[\u001b[38;2;255;158;3m\u001b[48;2;0;0;0mRELOADING...\u001b[0m]", "ERROR": "[\u001b[48;2;0;0;0mSYSTEM\u001b[0m]::[\u001b[38;2;255;0;0m\u001b[48;2;0;0;0mERROR\u001b[0m]", "SHUTDOWN": "[\u001b[48;2;0;0;0mSYSTEM\u001b[0m]::[\u001b[38;2;255;0;0m\u001b[48;2;0;0;0mSHUTDOWN\u001b[0m]" } }
修改完成后直接用原来的JS代码调用即可,ANSI颜色效果完全和预期一致。
方案2:转义反斜杠+JS侧解析
如果不想用Unicode转义,也可以把所有\x1B写成\\x1B,让JSON把内容存储为普通字符串,在JS侧使用时额外做一次转义解析即可,示例代码:
const parseAnsi = str => str.replace(/\\x1B/g, '\x1B'); console.log(`${parseAnsi(logs["SYSTEM"].SHUTDOWN)} - The bot has been shut down.`)
该方案需要改动原有调用逻辑,更推荐使用方案1。
内容的提问来源于stack exchange,提问作者Existentialist
相关产品推荐
相关产品推荐

