这应该很简单,但是我已经坚持了一个多小时,这让我发疯。
我正在使用一个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
文件?
答案 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’
})
很显然,您要为此添加错误处理(尝试/捕获)。