【问题标题】:Node JS, logging JSON with ansi codeNode JS,使用 ansi 代码记录 JSON
【发布时间】:2016-01-12 01:09:21
【问题描述】:

我只是想用一些 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

但是在记录对象或对其进行字符串化时,格式会被转义。有什么办法可以预防吗?
结果:

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

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

【问题讨论】:

  • 你想要达到的最终结果是什么?
  • 记录对象时有颜色。或者在使用JSON.stringify时不转义样式代码。
  • 所以你想要 {"s": "Hello World"} Hello World 是绿色的?
  • 没错! (当然目标不是将键和值连接在一起,我主要是出于好奇而问,我不太明白为什么会有stringify的行为,我想知道是否可以做到不同。)

标签: javascript json node.js


【解决方案1】:

我找到了一个(有点脏的)修复:

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

所以如果字符串包含\u001bstringify 将转义它:\\u001b。通过替换/\\/g,它实际上只匹配\,但它似乎也是stringify添加的那个。
第二个replace 将重新添加,只有一个并且未添加\。这是迄今为止我得到的最好的。

【讨论】:

    【解决方案2】:

    要从 a 对象中的每个字符串值中去除 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"}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-18
      • 2016-02-16
      • 2016-10-14
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多