JSON漂亮打印:如何输出十六进制格式的Buffer对象



我正在尝试打印一个包含多个Buffer实例的对象(该示例仅限于一个):

const buf = new Buffer.from("abcdefgh");
console.log(JSON.stringify({a:1,b:2,c:{d:1,e:buf}}, null, 4));

每当我将这样的对象转换为JSON时,输出是不需要的日志和缓冲区,以十进制而不是十六进制(例如十六进制字符串):

{
"a": 1,
"b": 2,
"c": {
"d": 1,
"e": {
"type": "Buffer",
"data": [
97,
98,
99,
100,
101,
102,
103,
104
]
}
}
}

我怎么能在Node.js中打印任意JavaScript对象,以一种方式,所有缓冲区实例打印为十六进制字符串像这样的十六进制?

{
"a": 1,
"b": 2,
"c": {
"d": 1,
"e": "6162636465666768"
}
}

当你将缓冲区添加到JSON中时,你应该添加字符串而不是缓冲区。

const buf = new Buffer.from('abcdefgh')
const myJson = JSON.stringify({ a: 1, b: 2, c: { d: 1, e: buf.toString('hex') } }, null, 4)
console.log(myJson)

因为您只是接收数据,所以需要检查是否有任何值是缓冲区,以及是否将其转换为十六进制字符串。我创建了一个递归函数来检查是否有任何值是对象,如果是,我递归地调用这个函数。如果值是一个缓冲区,则转换为十六进制字符串。

const buf = new Buffer.from('abcdefgh')
const stringJson = JSON.stringify({ a: 1, b: 2, c: { d: 1, e: buf } }, null, 4)
const parsedJson = JSON.parse(stringJson)
myRecursiveFunction(parsedJson)
console.log(parsedJson)
function myRecursiveFunction (obj) {
for (const key in obj) {
if (isObject(obj[key]) && !isBuffer(obj[key])) {
myRecursiveFunction(obj[key])
} else if (isBuffer(obj[key])) {
obj[key] = Buffer.from(obj[key].data).toString('hex')
}
}
}
function isBuffer (obj) {
return obj && obj.type && obj.type === 'Buffer'
}
function isObject (obj) {
return typeof obj === 'object' && !Array.isArray(obj) && obj !== null
}

相关内容

  • 没有找到相关文章

最新更新