如何从一个字符串中解析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)
}
})