如何從字符串解析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)
 }
})