我只是尝试在Node.js中使用一些ANSI样式代码记录JSON,下面是代码,并带有一些示例:
let s = chalk.green('Hello World')
let o = {s} // or {s: s}
console.log(s)
console.log(o)
console.log(o.s)
console.log(JSON.stringify(o))
(注意:chalk
就像colors
)
但是记录对象或对其进行字符串化时,格式会转义。有什么办法可以防止呢?结果:
所以就像登录\u001b[32mHello World\u001b[39m
和\\u001b[32mHello World\\u001b[39m
(带双\
)
PS:我知道有数百种解决方法,但是我偶然发现了这个问题,我一直在寻找一种简单的解决方案。谢谢!
我发现了(一种肮脏的)修复方法:
JSON.stringify(o)
.replace(/\\/g, '')
.replace(/u001b/g, '\u001b')
因此,如果字符串包含\u001b
,则stringify
将对其进行转义:\\u001b
。通过替换/\\/g
,它实际上仅与\
相匹配,但似乎也与stringify
相加。第二个replace
将重新添加,只有一个且未占用空间\
。这是我到目前为止获得的最好成绩。
要从对象中的每个字符串值中去除ansi转义码,请尝试以下操作:
const stripAnsi = require("strip-ansi")
const mapObj = require("map-obj")
const stripAnsiObj = (object) => mapObj(object, (key, value) => [key, stripAnsi(value)])
用法示例:
const chalk = require("chalk")
const object = {a: chalk.green("Hello World")}
JSON.stringify(object)
//=> {a: "\u001b[32mHello World\u001b[39m"}
JSON.stringify(stripAnsiObj(object))
//=> {a: "Hello World"}