JavaScript >> Javascript 文檔 >  >> Node.js

使用 Node.js 讀寫 JSON 文件

在用不同語言編寫的應用程序之間交換信息的最佳方式之一是使用 JSON(JavaScript 對象表示法)格式。由於其統一性和簡單性,JSON 幾乎完全取代了 XML,成為軟件中的標準數據交換格式,尤其是在 Web 服務中。

鑑於 JSON 在軟件應用程序中的廣泛使用,尤其是基於 JavaScript 的應用程序,了解如何在 Node.js 中讀取 JSON 數據並將其寫入文件非常重要。在本文中,我們將解釋如何執行這些功能。

讀取 JSON 文件

讓我們首先看看如何讀取已經創建的文件。但在我們這樣做之前,我們需要實際創建文件。在您喜歡的文本編輯器中打開一個新窗口,並在其中添加以下文本:

{ 
    "name": "Sara",
    "age": 23,
    "gender": "Female",
    "department": "History",
    "car": "Honda"
}

現在將此文件作為“student.json”保存到您的項目目錄中。

要從文件中讀取 JSON 數據,我們可以使用 Node.js fs 模塊。這個模塊中有兩個函數可以用來從文件系統中讀取文件:readFilereadFileSync .

雖然這兩個函數執行類似的任務,即從磁盤讀取文件,但區別在於這些函數實際執行的方式,我們將在下面的部分中更詳細地解釋。

使用 fs.readFileSync

readFileSync 函數以同步方式從文件中讀取數據。此函數阻止其餘代碼執行,直到從文件中讀取所有數​​據。當您的應用程序必須加載配置設置才能執行任何其他任務時,該功能特別有用。

為了繼續我們的示例,讓我們使用這個函數來讀取我們之前創建的“student.json”文件,使用 readFileSync 功能。將以下代碼添加到“.js”文件中:

'use strict';

const fs = require('fs');

let rawdata = fs.readFileSync('student.json');
let student = JSON.parse(rawdata);
console.log(student);

在上面的 Node.js 代碼中,我們首先加載 fs 模塊到我們的應用程序。接下來我們使用 readFileSync 函數並將相對文件路徑傳遞給我們要讀取的文件。如果您打印對象 rawdata 到控制台,您將在控制台屏幕上看到原始數據(在緩衝區中):

<Buffer 7b 20 0a 20 20 20 20 22 6e 61 6d 65 22 3a 20 22 53 61 72 61 22 2c 0a 20 20 20 20 22 61 67 65 22 3a 20 32 33 2c 0a 20 20 20 20 22 67 65 6e 64 65 72 22 ... >

但是,我們希望讀取 JSON 格式的文件,而不是原始的十六進制數據。這是 JSON.parse 功能開始發揮作用。此函數處理原始數據的解析,將其轉換為 ASCII 文本,並將實際的 JSON 數據解析為 JavaScript 對象。現在,如果您打印 student 控制台上的對象,您將獲得以下輸出:

{ name: 'Sara',
  age: 23,
  gender: 'Female',
  department: 'History',
  car: 'Honda' }

如您所見,我們文件中的 JSON 已成功加載到 student 對象。

使用 fs.readFile

在 Node.js 中讀取 JSON 文件的另一種方法是使用 readFile 功能。不同於 readFileSync 函數,readFile 函數以異步方式讀取文件數據。當 readFile 函數被調用,文件讀取過程開始,控制立即轉移到下一行執行剩餘的代碼行。加載文件數據後,此函數將調用提供給它的回調函數。這樣您就不會在等待操作系統返回數據時阻塞代碼執行。

在我們的示例中,readFile 函數有兩個參數:要讀取的文件的路徑和文件被完全讀取時要調用的回調函數。您還可以選擇包含帶有選項的參數,但我們不會在本文中介紹這些內容。

看看下面的例子,了解如何使用 readFile 功能。

'use strict';

const fs = require('fs');

fs.readFile('student.json', (err, data) => {
    if (err) throw err;
    let student = JSON.parse(data);
    console.log(student);
});

console.log('This is after the read call');

上面的代碼和我們之前的代碼片段完全一樣(額外的 console.log 調用),但它是異步執行的。以下是您可能已經註意到的一些差異:

  • (err, data) => {} :這是我們的回調函數,在文件被完全讀取後執行
  • err :因為我們不能輕易地使用異步代碼的 try/catch,所以這個函數給了我們一個 err 如果出現問題,反對。它是 null 如果沒有錯誤

您可能還注意到,我們在調用 readFile 後立即將字符串打印到控制台 .這是為了向您展示異步代碼的行為。當上面的腳本執行時,你會看到這個console.log 執行之前 readFile 回調函數執行。這是因為 readFile 從文件系統讀取數據時不會阻止代碼執行。

代碼的輸出將如下所示:

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

This is after the read call
{ name: 'Sara',
  age: 23,
  gender: 'Female',
  department: 'History',
  car: 'Honda' }

如您所見,我們文件中的最後一行代碼實際上是輸出中最先出現的代碼。

使用 require

另一種方法是使用全局 require 讀取和解析 JSON 文件的方法。這與加載 Node 模塊的方法相同,但也可用於加載 JSON。

看看下面的例子。

'use strict';

let jsonData = require('./student.json');

console.log(jsonData);

它的工作原理與 readFileSync 完全相同 我們上面展示的代碼,但它是一個全局可用的方法,你可以在任何地方使用,這有它的優勢。

然而 require 也有一些缺點 功能:

  • Require 是同步函數,只被調用一次,這意味著調用會收到一個緩存的結果。如果文件已更新,則無法使用此方法重新讀取它
  • 您的文件必須具有“.json”擴展名,因此不能靈活。沒有正確的擴展名 require 不會將該文件視為 JSON 文件。

將 JSON 寫入文件

類似於 readFilereadFileSync 函數,將數據寫入文件有兩個函數:writeFilewriteFileSync .顧名思義,writeFile writeFileSync 方法以異步方式將數據寫入文件 函數以同步方式將數據寫入文件。

我們將在以下部分中仔細研究。

使用 fs.writeFileSync

writeFileSync 該函數接受2-3個參數:要寫入數據的文件的路徑、要寫入的數據和一個可選參數。

請注意,如果該文件尚不存在,則會為您創建一個新文件。看看下面的例子:

'use strict';

const fs = require('fs');

let student = { 
    name: 'Mike',
    age: 23, 
    gender: 'Male',
    department: 'English',
    car: 'Honda' 
};
 
let data = JSON.stringify(student);
fs.writeFileSync('student-2.json', data);

在上面的例子中,我們存儲了我們的 JSON 對象 student 到一個名為“student-2.json”的文件。請注意,這裡我們必須使用 JSON.stringify 保存數據之前的功能。就像我們在讀取 JSON 文件時需要將數據解析為 JSON 格式一樣,我們需要將數據“字符串化”,然後才能將其以字符串形式存儲在文件中。

執行以上代碼,打開“student-2.json”文件。您應該在文件中看到以下內容:

{"name":"Mike","age":23,"gender":"Male","department":"English","car":"Honda"}

雖然這是我們要寫入的數據,但是數據是一行字符串的形式,我們很難閱讀。如果您希望序列化的 JSON 可讀,請更改 JSON.Stringify 功能如下:

let data = JSON.stringify(student, null, 2);

在這裡,我們告訴該方法向序列化的 JSON 添加換行符和幾個縮進。現在如果你打開“student-2.json”文件,你應該會看到如下格式的文本。

{
  "name": "Mike",
  "age": 23,
  "gender": "Male",
  "department": "English",
  "car": "Honda"
}
使用 fs.writeFile

正如我之前提到的,writeFile 函數以異步方式執行,這意味著我們的代碼在寫入數據時不會被阻塞 文件。和之前的異步方法一樣,我們需要給這個函數傳遞一個回調。

讓我們使用 writeFile 編寫另一個文件“student-3.json” 功能。

'use strict';

const fs = require('fs');

let student = { 
    name: 'Mike',
    age: 23, 
    gender: 'Male',
    department: 'English',
    car: 'Honda' 
};
 
let data = JSON.stringify(student, null, 2);

fs.writeFile('student-3.json', data, (err) => {
    if (err) throw err;
    console.log('Data written to file');
});

console.log('This is after the write call');

上述腳本的輸出將是:

This is after the write call
Data written to file

再一次,你可以看到我們代碼的最後一行實際上首先出現在控制台中,因為我們的回調還沒有被調用。如果您有大量數據要寫入文件,或者有很多文件要寫入,這最終會節省相當多的執行時間。

了解更多

想了解更多關於 Node.js 的基礎知識嗎?就個人而言,我建議參加 Wes Bos 的 Learn Node.js 之類的在線課程。您不僅將學習最新的 ES2017 語法,還將構建一個全棧餐廳應用程序。根據我的經驗,構建這樣的真實應用是最快的學習方式。

結論

在整篇文章中,我們展示瞭如何從文件中讀取和寫入 JSON 數據,這是作為 Web 程序員了解如何做的一項非常常見且重要的任務。

fs 中有幾個方法 用於讀取和寫入 JSON 文件的模塊。 readFilereadFileSync 函數將分別以異步和同步方式從文件中讀取 JSON 數據。您也可以使用全局 require 在一行代碼中處理從文件中讀取/解析 JSON 數據的方法。但是,require 是同步的,只能從擴展名為 '.json' 的文件中讀取 JSON 數據。

同樣,writeFilewriteFileSync fs 中的函數 模塊分別以異步和同步的方式將JSON數據寫入文件。


Tutorial JavaScript 教程
  1. ⚛️ 我是一名專業的 React 開發人員,這是我用於生產項目的目錄結構。 ⚛️

  2. Redux - 核心概念

  3. 使用純 CSS 框架的樣式化組件

  4. 從字典列表中提取值並填充組件

  5. Redux 工具包

  6. React 中的路由 |反應路由器更新

  7. Angular - 使用組件層次結構

  1. 從客戶端執行異步服務器功能

  2. 插入排序 JavaScript:面向 JS 初學者的插入排序

  3. 在 ReactJS 上嵌入 Twitter 小部件

  4. 如何將屬性直接傳遞給 vuejs 中的組件,例如 reactjs

  5. 創建 React 應用程序並了解文件夾結構

  6. 函數式編程:在原型上實現過濾器方法

  7. 使用 MATLAB 和 MEAN Stack 創建 Web 應用程序

  1. 將 Kendo UI 圖表添加到我們的待辦事項應用程序

  2. 學習 Angular 9 的基礎知識:構建一個計算器應用程序

  3. 想要您的項目中的 Instagram 提要?

  4. 更好的引語:不要重複標記