#node.js #json #hex
Вопрос:
Я пытаюсь напечатать объект, содержащий несколько экземпляров буфера (пример ограничен одним).:
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
]
}
}
}
Как я могу довольно красиво печатать произвольные объекты JavaScript в Node.js таким образом, чтобы все экземпляры буфера печатались как хорошая шестнадцатеричная строка, как шестнадцатеричная, как это?
{
"a": 1,
"b": 2,
"c": {
"d": 1,
"e": "6162636465666768"
}
}
Ответ №1:
Когда вы добавляете буфер в 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]) amp;amp; !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 amp;amp; obj.type amp;amp; obj.type === 'Buffer'
}
function isObject (obj) {
return typeof obj === 'object' amp;amp; !Array.isArray(obj) amp;amp; obj !== null
}
Комментарии:
1. Я не добавляю буфер. Я готовлюсь к использованию объектов, которые хочу напечатать в виде строки Джона. Код, показанный в моем вопросе, является лишь примером того, как такой объект может выглядеть одинаково.
2. Я обновил, чтобы выполнить ваши требования.