Node JS,使用ansi代码记录JSON

问题描述 投票:0回答:2

我只是尝试在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

但是记录对象或对其进行字符串化时,格式会转义。有什么办法可以防止呢?结果:enter image description here

所以就像登录\u001b[32mHello World\u001b[39m\\u001b[32mHello World\\u001b[39m(带双\

PS:我知道有数百种解决方法,但是我偶然发现了这个问题,我一直在寻找一种简单的解决方案。谢谢!

javascript json node.js
2个回答
0
投票

我发现了(一种肮脏的)修复方法:

JSON.stringify(o)
  .replace(/\\/g, '')
  .replace(/u001b/g, '\u001b')

因此,如果字符串包含\u001b,则stringify将对其进行转义:\\u001b。通过替换/\\/g,它实际上仅与\相匹配,但似乎也与stringify相加。第二个replace将重新添加,只有一个且未占用空间\。这是我到目前为止获得的最好成绩。


0
投票

要从对象中的每个字符串值中去除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"}
© www.soinside.com 2019 - 2024. All rights reserved.