معالجة JSON في Node.js: دليل شامل
JSON (JavaScript Object Notation) هو تنسيق خفيف لتبادل البيانات يعتمد على بناء جملة كائنات JavaScript. في بيئة Node.js، يعد العمل مع JSON مهمة يومية: من ملفات التكوين إلى طلبات API. في هذه المقالة، سنشرح بالتفصيل جميع جوانب معالجة JSON، بما في ذلك التحليل والتسلسل والتحقق من الصحة والعمل مع الملفات الكبيرة.
الطرق الأساسية: JSON.parse() و JSON.stringify()
طريقتان رئيسيتان للعمل مع JSON مدمجتان مباشرة في JavaScript. وهما متاحتان عالميًا ولا تتطلبان تثبيت مكتبات إضافية.
JSON.parse() — تحويل سلسلة نصية إلى كائن
تأخذ طريقة JSON.parse() سلسلة JSON وتعيد كائن JavaScript المقابل. إذا كانت السلسلة تحتوي على JSON غير صالح، فسيتم طرح استثناء SyntaxError.
const jsonString = '{"name": "آنا", "age": 28, "isStudent": false}';const user = JSON.parse(jsonString);console.log(user.name); // "آنا"console.log(user.age); // 28يمكن تمرير دالة مراجعة كمعامل اختياري ثاني، والتي تسمح بتعديل القيم أثناء عملية التحليل:
const json = '{"year": "2024", "price": "1500.50"}';const data = JSON.parse(json, (key, value) => { if (key === 'price') return parseFloat(value); if (key === 'year') return parseInt(value); return value;});console.log(typeof data.price); // "number"JSON.stringify() — تحويل كائن إلى سلسلة نصية
تقوم طريقة JSON.stringify() بالعكس: تحول كائنًا أو قيمة إلى سلسلة JSON. تقبل ما يصل إلى ثلاث وسائط: القيمة، دالة استبدال أو مصفوفة من المفاتيح، وعدد المسافات للتنسيق.
const user = { name: "إيفان", age: 32, skills: ["JS", "Node", "Python"]};
// بدون تنسيقconsole.log(JSON.stringify(user));// {"name":"إيفان","age":32,"skills":["JS","Node","Python"]}
// مع التنسيق (مسافتان)console.log(JSON.stringify(user, null, 2));/*{ "name": "إيفان", "age": 32, "skills": [ "JS", "Node", "Python" ]}*/يمكن أن تكون الوسيطة الثانية مصفوفة من المفاتيح للتصفية:
console.log(JSON.stringify(user, ['name', 'age']));// {"name":"إيفان","age":32}العمل مع ملفات JSON في Node.js
في Node.js، غالبًا ما يكون من الضروري قراءة وكتابة ملفات JSON. لهذا الغرض، يتم استخدام وحدات fs (نظام الملفات).
قراءة ملف JSON
const fs = require('fs');
// قراءة متزامنةtry { const data = fs.readFileSync('config.json', 'utf8'); const config = JSON.parse(data); console.log(config.port);} catch (err) { console.error('خطأ في قراءة الملف:', err.message);}
// قراءة غير متزامنةfs.readFile('config.json', 'utf8', (err, data) => { if (err) { console.error('خطأ:', err); return; } const config = JSON.parse(data); console.log(config.port);});كتابة ملف JSON
const fs = require('fs');
const settings = { theme: 'dark', language: 'ar', fontSize: 14};
// كتابة متزامنةfs.writeFileSync('settings.json', JSON.stringify(settings, null, 2));
// كتابة غير متزامنةfs.writeFile('settings.json', JSON.stringify(settings, null, 2), (err) => { if (err) console.error('خطأ في الكتابة:', err); else console.log('تم حفظ الملف');});التحقق من صحة JSON
قبل استخدام البيانات، يجب دائمًا التحقق من صحتها. أبسط طريقة هي تغليف JSON.parse() في try-catch. للتحقق الأكثر تعقيدًا من بنية البيانات، يمكن استخدام المكتبات.
التحقق باستخدام try-catch
function safeJsonParse(str) { try { return { data: JSON.parse(str), error: null }; } catch (e) { return { data: null, error: e.me