از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
خواندن و نوشتن فایلهای JSON با Node.js یکی از بهترین راهها برای تبادل اطلاعات بین برنامههای نوشته شده به زبانهای مختلف، استفاده از فرمت JSON (JavaScript Object Notation) است. به لطف یکنواختی و سادگی، JSON تقریباً به طور کامل جایگزین XML به عنوان فرمت استاندارد تبادل داده در نرم افزار، به ویژه در خدمات وب شده است. با توجه به گستردگی …
سرفصلهای مطلب
یکی از بهترین راه ها برای تبادل اطلاعات بین اپلیکیشن های نوشته شده به زبان های مختلف، استفاده از آن است JSON فرمت (Notation Object JavaScript). به لطف یکنواختی و سادگی، JSON تقریباً به طور کامل جایگزین XML به عنوان فرمت استاندارد تبادل داده در نرم افزار، به ویژه در خدمات وب شده است.
با توجه به استفاده گسترده از JSON در برنامه های کاربردی نرم افزاری و به خصوص برنامه های کاربردی مبتنی بر جاوا اسکریپت، دانستن روش خواندن و نوشتن داده های JSON در یک فایل در Node.js بسیار مهم است. در این مقاله روش انجام این عملکردها را توضیح خواهیم داد.
خواندن یک فایل JSON
بیایید ابتدا ببینیم چگونه می توانیم فایلی را که قبلا ایجاد شده است بخوانیم. اما قبل از انجام این کار باید در واقع فایل را ایجاد کنیم. یک پنجره جدید در ویرایشگر متن مورد علاقه خود باز کنید و متن زیر را به آن اضافه کنید:
{
"name": "Sara",
"age": 23,
"gender": "Female",
"department": "History",
"car": "Honda"
}
حال این فایل را به عنوان ذخیره کنید student.json
به دایرکتوری پروژه شما
برای خواندن داده های JSON از فایل می توانیم از Node.js استفاده کنیم fs مدول. دو عملکرد در این ماژول موجود است که می توانیم از آنها برای خواندن فایل ها از سیستم فایل استفاده کنیم: readFile
و readFileSync
.
اگرچه هر دوی این توابع وظایف مشابهی را انجام میدهند، یعنی خواندن فایلها از دیسک، تفاوت در روش اجرای واقعی این توابع است که در بخشهای زیر با جزئیات بیشتر توضیح خواهیم داد.
با استفاده از fs.readFileSync
این readFileSync
تابع داده ها را از یک فایل به صورت همزمان می خواند. این تابع اجرای بقیه کدها را تا زمانی که همه داده ها از یک فایل خوانده شوند مسدود می کند. این عملکرد به ویژه زمانی مفید است که برنامه شما مجبور است تنظیمات پیکربندی را قبل از انجام هر کار دیگری بارگیری کند.
برای ادامه مثال خود، از این تابع برای خواندن استفاده می کنیم student.json
فایلی که قبلاً با استفاده از readFileSync
تابع. کد زیر را به a اضافه کنید .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
تابع و مسیر فایل نسبی را به فایلی که می خواهیم بخوانیم ارسال کنیم. اگر شما print شی rawdata
به console، داده های خام را خواهید دید (در a بافر) روی را console صفحه نمایش:
<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 واقعی را در یک شی جاوا اسکریپت تجزیه میکند. حالا اگر شما print را student
هدف – شی روی را console، خروجی زیر را دریافت خواهید کرد:
{ name: 'Sara',
age: 23,
gender: 'Female',
department: 'History',
car: 'Honda' }
همانطور که می بینید، JSON از فایل ما با موفقیت در بارگیری شد student
هدف – شی.
با استفاده از fs.readFile
روش دیگری که می توانید فایل JSON را در Node.js بخوانید استفاده از آن است readFile
تابع. بر خلاف readFileSync
تابع، readFile
تابع داده های فایل را به صورت ناهمزمان می خواند. وقتی یک readFile
تابع خوانده می شود، خواندن فایل process شروع می شود و بلافاصله کنترل به خط بعدی منتقل می شود و خطوط باقیمانده کد را اجرا می کند. هنگامی که داده های فایل بارگذاری شد، این تابع تابع callback ارائه شده به آن را فراخوانی می کند. به این ترتیب در حالی که منتظر هستید تا سیستم عامل با داده ها به شما بازگردد، اجرای کد را مسدود نمی کنید.
در مثال ما، 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) => {}
: این تابع callback ما است که پس از خواندن کامل فایل اجرا می شودerr
: از آنجایی که نمیتوانیم به راحتی از try/catch با کد ناهمزمان استفاده کنیم، تابع در عوض به ما یکerr
اگر مشکلی پیش آمد مخالفت کنید. این استnull
اگر هیچ خطایی وجود نداشت
شاید شما هم متوجه شده باشید که ما print یک رشته به console بلافاصله پس از تماس readFile
. این برای نشان دادن رفتار کدهای ناهمزمان است. وقتی اسکریپت بالا اجرا شد، خواهید دید که این console.log
اجرا می کند قبل از را readFile
تابع callback اجرا می شود. این بخاطر این است که readFile
هنگام خواندن داده ها از سیستم فایل، اجرای کد را مسدود نمی کند.
خروجی کد به شکل زیر خواهد بود:
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 در یک فایل
شبیه به readFile
و readFileSync
توابع، دو تابع برای نوشتن داده ها در فایل ها وجود دارد: writeFile
و writeFileSync
. همانطور که از نام ها پیداست، 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 تجزیه کنیم، قبل از اینکه بتوانیم آنها را به شکل رشتهای در فایل ذخیره کنیم، باید دادهها را “string” کنیم.
کد بالا را اجرا کرده و باز کنید 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
تابع به صورت ناهمزمان اجرا می شود، به این معنی که کد ما در هنگام نوشتن داده مسدود نمی شود به پرونده. و درست مانند متدهای ناهمزمان قبلی، باید یک callback به این تابع ارسال کنیم.
بیایید یک فایل دیگر بنویسیم، student-3.json
، با استفاده از writeFile
تابع.
'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
و دوباره، می توانید ببینید که آخرین خط کد ما در واقع ابتدا در قسمت نمایش داده می شود console از آنجایی که تماس ما هنوز تماس گرفته نشده است. اگر مقدار زیادی داده برای نوشتن در فایل خود دارید، یا اگر تعداد کمی فایل برای نوشتن دارید، در نهایت باعث صرفه جویی در زمان اجرا می شود.
بیشتر بدانید
آیا می خواهید در مورد اصول Node.js بیشتر بدانید؟ من شخصاً توصیه می کنم یک دوره آنلاین مانند Node.js را توسط Wes Bos بیاموزید. نه تنها بهروزترین نحو ES2017 را یاد خواهید گرفت، بلکه میتوانید یک برنامه رستوران کامل بسازید. در تجربه من، ساختن اپلیکیشن های دنیای واقعی مانند این سریع ترین راه برای یادگیری است.
نتیجه
در طول این مقاله نشان دادیم که چگونه میتوانید دادههای JSON را از و روی فایلها بخوانید و بنویسید، که یک کار بسیار رایج و مهم برای دانستن اینکه چگونه به عنوان یک برنامهنویس وب انجام دهید.
چند روش در این وجود دارد fs
ماژول برای خواندن و نوشتن از فایل های JSON. این readFile
و readFileSync
توابع داده های JSON را از فایل به ترتیب به صورت ناهمزمان و همزمان می خوانند. شما همچنین می توانید از جهانی استفاده کنید require
روشی برای مدیریت خواندن/تجزیه داده های JSON از یک فایل در یک خط کد. با این حال، require
همزمان است و فقط میتواند دادههای JSON را از فایلهایی با آن بخواند .json
افزونه.
به طور مشابه، writeFile
و writeFileSync
توابع از fs
ماژول داده های JSON را به ترتیب به صورت ناهمزمان و همزمان در فایل بنویسید.
منتشر شده در 1403-01-27 22:38:16