用Node.js解析JSON的方法

1,009 阅读2分钟

如何从一个字符串中解析JSON,以及如何在Node.js中读取JSON文件

如果你有JSON数据作为字符串的一部分,最好的方法是使用JSON.parse ,这是自ECMAScript 5以来JavaScript标准的一部分,它由V8提供,V8是支持Node.js的JavaScript引擎。

例子。

const data = '{ "name": "Flavio", "age": 35 }'
try {
  const user = JSON.parse(data)
} catch(err) {
  console.error(err)
}

请注意,JSON.parse 是同步的,所以JSON文件越大,你的程序执行就会被阻止,直到JSON解析完毕。

你可以通过将JSON包在一个承诺和setTimeout调用中来异步处理它,这样可以确保解析在事件循环的下一次迭代中进行。

const parseJsonAsync = (jsonString) => {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(JSON.parse(jsonString))
    })
  })
}

const data = '{ "name": "Flavio", "age": 35 }'
parseJsonAsync(data).then(jsonData => console.log(jsonData))

如果你的JSON是在一个文件中,你首先要读取它。

一个非常简单的方法是使用require()

const data = require('./file.json')

由于你使用了.json 扩展,require() 足够聪明,可以理解这一点,并解析data 对象中的JSON。

有一点需要注意的是,文件读取是同步的。另外,require()调用的结果是缓存的,所以如果你因为更新了文件而再次调用它,在程序退出之前你不会得到新的内容。

提供这个功能是为了使用JSON文件进行应用配置,这是一个完全有效的用例。

你也可以手动读取文件,使用fs.readFileSync

const fs = require('fs')
const fileContents = fs.readFileSync('./file.json', 'utf8')

try {
  const data = JSON.parse(fileContents)
} catch(err) {
  console.error(err)
}

这将同步读取文件。

你也可以使用fs.readFile ,异步地读取文件,这是最好的选择。在这种情况下,文件内容是作为一个回调提供的,在回调里面你可以处理JSON。

const fs = require('fs')

fs.readFile('/path/to/file.json', 'utf8', (err, fileContents) => {
  if (err) {
    console.error(err)
    return
  }
  try {
    const data = JSON.parse(fileContents)
  } catch(err) {
    console.error(err)
  }
})