Node JS,使用ansi代码记录JSON

时间:2016-01-12 01:09:21

标签: javascript json node.js

我只是尝试使用一些ANSI样式代码来记录JSON,在Node.js中,这是代码,有几个例子:

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:我知道有数百种解决方法,但我偶然发现了这个问题,我一直在寻找一个简单的解决方案。 THX!

2 个答案:

答案 0 :(得分:0)

我发现了一种(有点脏)修复:

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

因此,如果字符串包含\u001b,则stringify将转义它:\\u001b。通过替换/\\/g,它实际上只与\匹配,但它似乎也是stringify添加的那个。 第二个replace将重新添加,只有一个{uneaped \。这是我到目前为止所做的最好的。

答案 1 :(得分: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"}