如何從字符串解析JSON,以及如何在Node.js中讀取JSON文件
如果您有一個字符串作為一部分的JSON數據,最好的方法是使用JavaScript標準的JSON.parse
方法來解析數據。自ECMAScript 5以來,這個方法已經提供給V8,這是Node.js所使用的JavaScript引擎。
示例:
const data = '{ "name": "Flavio", "age": 35 }'
try {
const user = JSON.parse(data)
} catch(err) {
console.error(err)
}
請注意,JSON.parse
是同步的,所以JSON文件越大,你的程序執行時間也會越長,因為需要阻塞程序執行直到解析完成。
你可以通過將其放在一個promise和setTimeout調用中,以異步方式處理JSON。這確保解析在事件循環的下一次迭代中進行。
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()
足夠聰明,會自動解析JSON數據到data對象中。
唯一的一個缺點是文件讀取是同步的方式進行的。此外,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)
}
})