Печать в формате JSON: как выводить буферные объекты в шестнадцатеричном формате

#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. Я обновил, чтобы выполнить ваши требования.