将服务器主体中的json文件转换为节点

时间:2019-01-13 09:01:01

标签: node.js json parsing

这应该很简单,但是我已经坚持了一个多小时,这让我发疯。

我正在使用一个API,该API以压缩的.json文件的形式返回数据。我已经设法解压缩了文件,但是现在需要将这些文件解析为json对象。

数据在缓冲区中,如下所示:

{ "name": "foo1", "job": "bar1" }
{ "name": "foo2", "job": "bar2" }
{ "name": "foo3", "job": "bar3" }
{ "name": "foo4", "job": "bar4" }

当然,用JSON.parse()进行解析会失败,因为数据是.json文件,而不是json数组。

如何正确解析此数据? fs希望有一个文件路径来读取文件,就我而言,这是行不通的(据我所知),因为数据来自缓冲区而不是本地文件。

tl;博士:您如何解析没有文件路径的.json文件?

2 个答案:

答案 0 :(得分:1)

您可以将缓冲区数据更改为utf-8字符集字符串,然后解析它:

JSON.parse(buffer.toString('utf-8'))

答案 1 :(得分:1)

首先,您提供的示例(每行是代表JSON对象的字符串)不是JSON文件。

该文件包含多个JSON格式的字符串,每行一个。

没有周围的数组,难怪您无法解析它。

我也不确定将数据保存在缓冲区中是什么意思。

您是说您已经使用标准的fs.readfile()或变体来读取文件的内容吗?

在这种情况下,您需要将读取文件中返回的Buffer转换为String,如下所示:

var contents = fs.readfileSync(FILEPATH).toString()

完成此操作后,您可以使用文件的内容构造一个Array,然后使用以下命令将结果转换为JSON格式的字符串:

fs.readfile(FILEPATH, (err, buf) => {
  if (err) {
    throw err
  }

  let objAry = []
  buf.toString().split(/\r?\n/).forEach( line => {
    objAry.push(JSON.parse(line))
  })

  let jsonStr = JSON.stringify(objAry)

  // do something with the result string
  // possibly sending it as a response to an API
  // request as ‘Content-Type: application/json’
})

很显然,您要为此添加错误处理(尝试/捕获)。