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

Posted

技术标签:

【中文标题】将服务器主体中的 json 文件转换为节点中的 json 对象【英文标题】:Convert a json file from server body to a json object in node 【发布时间】:2019-06-07 14:34:31 【问题描述】:

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

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

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

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

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

如何正确解析这些数据? fs 需要一个文件路径来读取文件,这在我的情况下不起作用(据我所知),因为数据来自缓冲区,而不是来自本地文件。

tl;dr:我如何解析没有文件路径的 .json 文件?

【问题讨论】:

【参考方案1】:

您可以将缓冲区数据更改为utf-8 charset String 然后解析它:

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

【讨论】:

正如我在问题中所说,数据不是json字符串,它是一个.json文件,这意味着它不能被JSON.parse解析。 @Malfunction 没问题。这是一个.json 文件。现在,如果您想使用fs 阅读此内容,或者通过multer 获取它的小瓶multipart HTTP 请求,它是buffer,我假设它的变量名是buffer。只需将您的数据放在缓冲区中,然后执行上述操作。【参考方案2】:

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

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

没有环绕数组,难怪解析不出来。

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

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

如果是这种情况,您需要将从您的 readfile 返回的 Buffer 转换为 String,如下所示:

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

完成此操作后,您可以使用文件的内容构造一个数组,然后使用以下方法将结果转换为 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’
)

显然,您需要为此添加错误处理(try/catch)。

【讨论】:

我希望有比拆分和添加每一行更好的方法,但如果它不是有效的 .json,我想现在就可以了。非常感谢!

以上是关于将服务器主体中的 json 文件转换为节点中的 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

无法将 groupby 数据集转换为 pandas 中的 json [重复]

将首先转换为 Observable 的 json 文件转换为打字稿中的地图,角度

是否可以将所有阶段变量添加到嵌套 JSON 结构中的主体映射模板中?

如何将 XML 属性转换为文本节点

将XML文件中的内容转换为Json对象

Kotlin > Spring Boot > 使用路由器 DSL,POST 方法主体,无法将 JSON 转换为 POJO