将JSON对象转换为缓冲区,再将缓冲区转换回JSON对象

182

我有一个 JSON 对象,正在将其转换为 Buffer 并在此处进行一些处理。稍后,我想将相同的缓冲区数据转换为有效的 JSON 对象。

我正在使用 Node V6.9.1 进行开发。

以下是我尝试的代码,但是当我将其转换回 JSON 并且不能打开此对象时,我会得到[object object]

var obj = {
   key:'value',
   key:'value',
   key:'value',
   key:'value',
   key:'value'
}

var buf = new Buffer.from(obj.toString());

console.log('Real Buffer ' + buf);  //This prints --> Real Buffer <Buffer 5b 6f 62 6a 65 63 74>

var temp = buf.toString();

console.log('Buffer to String ' + buf);  //This prints --> Buffer to String [object Object]

所以我尝试使用inspect方法打印整个对象

console.log('Full temp ' + require('util').inspect(buf, { depth: null }));  //This prints --> '[object object]' [not printing the obj like declared above]

如果我尝试像读取数组一样读取它

 console.log(buf[0]);  // This prints --> [ 

我尝试解析,但出现了SyntaxError: Unexpected token o in JSON at position 2

我需要将其视为真正的对象,就像我之前创建的一样(我的意思是像之前声明的那样)。

请帮忙解决..


({"id":"value"}).toString() === '[object Object]' //true - Eric Hodonsky
1
new Buffer()已被弃用。请参见此处:https://nodejs.org/api/buffer.html#buffer_new_buffer_array - Spencer
3个回答

346

你需要将json转化为字符串,而不是调用 toString 方法。

var buf = Buffer.from(JSON.stringify(obj));

将字符串转换为JSON对象的方法:

var temp = JSON.parse(buf.toString());

3
如果 obj 中存在另一个缓冲区字段,则此方法将无法运行。 - gilamran
17
这里其实不需要使用toString。 - Dzenly
1
对我来说,当我去掉了JSON.stringify并直接将对象放入参数中时,它就起作用了,就像这样:var buf = Buffer.from({ key:'value', key:'value', key:'value', key:'value', key:'value' }); - Jorge Mauricio
1
@JorgeMauricio Buffer.from() 不支持对象或(技术上)数组。这应该是一个错误,但我认为您的对象正在转换为字符串。简而言之,只需使用Buffer.from(JSON.stringify(...))和JSON.parse(buffer.toString())来处理简单对象。然而,如果您在对象中存储了缓冲区,则必须编写递归函数以遍历对象底部,并将所有缓冲区转换为字符串,然后将对象“stringify”为缓冲区,然后在另一侧执行相反操作。 - Werlious
2
@Dzenly 虽然 toString 在技术上不是必需的,但应该使用它。阅读您提供的页面,它指出缓冲区将使用 utf8 编码转换为字符串(使用 Buffer.toString),虽然通常这不是问题,但如果缓冲区是在其他编码中创建的,则会得到垃圾数据。因此,对于像这样的事情,应该没问题,但对于许多其他场景(其中您几乎无法控制传递的内容),了解和尊重编码是必须的。 - Werlious
1
好观点 @werlious,另外 typescript 不允许 JSON.parse(buffer) - Isaac

7

这里输入图片描述

请复制以下片段:

const jsonObject = {
        "Name":'Ram',
        "Age":'28',
        "Dept":'IT'
      }
      const encodedJsonObject = Buffer.from(JSON.stringify(jsonObject)).toString('base64'); 
      console.log('--encodedJsonObject-->', encodedJsonObject)
      //Output     --encodedJsonObject--> eyJOYW1lIjoiUmFtIiwiQWdlIjoiMjgiLCJEZXB0IjoiSVQifQ==

      const decodedJsonObject = Buffer.from(encodedJsonObject, 'base64').toString('ascii'); 
      console.log('--decodedJsonObject-->', JSON.parse(decodedJsonObject))
      //Output     --decodedJsonObject--> {Name: 'Ram', Age: '28', Dept: 'IT'}

3

作为@Ebrahim,您需要首先使用JSON.stringify将JSON转换为字符串,然后才能将其转换为缓冲区。但是使用JSON.stringify有一定风险,因为在自引用或循环引用的情况下可能会破坏您的应用程序:

   var y={}
   y.a=y
   JSON.stringify(y) // Uncaught TypeError: Converting circular structure to JSON

如果您面临此类风险,最好使用安全的字符串化解决方案,例如npm模块safe-json-stringify。然后需要执行以下操作:
// convert to buffer:
const stringify = require('safe-json-stringify');
var buf = Buffer.from(stringify(obj));

// convert from buffer:
var temp = JSON.parse(buf.toString());


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接