JSON في JavaScript
JSON (صيغة ترميز كائنات JavaScript) هو صيغة خفيفة لتبادل البيانات. فكّر فيه كصندوق شحن معياري — بغض النظر عمّا تضعه في الداخل، التغليف يتبع مواصفات عالمية بحيث يعرف المستلم بالضبط كيفية فتحه. الاتصال الأمامي/الخلفي، ملفات التكوين، التخزين المحلي — JSON في كل مكان.
قواعد صيغة JSON
JSON يشبه كثيراً كائن JS الحرفي، لكن القواعد أكثر صرامة:
| القاعدة | الوصف |
|---|---|
| المفاتيح يجب أن تستخدم مزدوجة الاقتباس | "name" ✅ name ❌ 'name' ❌ |
| قيم السلاسل يجب أن تستخدم مزدوجة الاقتباس | "hello" ✅ 'hello' ❌ |
| بدون فواصل متدلية | {"a":1,} ❌ |
| أنواع قيم محدودة | سلسلة، رقم، منطقي، null، كائن، مصفوفة |
| غير مسموح | undefined، دوال، تعليقات |
JSON
{
"name": "أليس",
"age": 25,
"skills": ["HTML", "CSS", "JS"],
"address": {
"city": "نيويورك",
"zip": "10001"
},
"active": true,
"spouse": null
}
⚠️ بدون اقتباسات مفردة في JSON! الخطأ الأكثر شيوعاً للمبتدئين هو كتابة
'key' أو 'value' — هذا صالح في JS لكن غير قانوني في JSON.
JSON.stringify()
JSON.stringify() يconvert قيمة JS إلى سلسلة JSON — تسلسل.
HTML
<script>
JSON.stringify(value)
JSON.stringify(value, replacer)
JSON.stringify(value, replacer, space)
</script>
| المعلمة | الوصف |
|---|---|
value |
القيمة المراد تسلسلها |
replacer |
تصفية أو تحويل — دالة أو مصفوفة |
space |
المسافة البادئة — رقم أو سلسلة، للطباعة الجميلة |
مثال: التسلسل والتنسيق
HTML
<div id="output" style="white-space: pre; font-family: monospace; padding: 10px; border: 1px solid #ccc; direction: ltr; text-align: left;"></div>
<script>
const student = {
name: 'بوب',
age: 20,
scores: [95, 88, 92],
active: true,
grade: undefined,
birthday: new Date()
};
const output = document.getElementById('output');
const plain = JSON.stringify(student);
output.textContent = 'إخراج مدمج:\n' + plain + '\n\n';
const pretty = JSON.stringify(student, null, 2);
output.textContent += 'إخراج جميل:\n' + pretty + '\n\n';
const filtered = JSON.stringify(student, ['name', 'scores'], 2);
output.textContent += 'الاسم والدرجات فقط:\n' + filtered;
</script>
💡 ملاحظة:
undefined، الدوال، و الرموز تتجاهل أثناء التسلسل (الخصائص تختفي من الكائنات، تصبح null في المصفوفات). كائنات Date تconvert إلى سلاسل ISO.
JSON.parse()
JSON.parse() يconvert سلسلة JSON إلى قيمة JS — فك التسلسل.
HTML
<script>
JSON.parse(text)
JSON.parse(text, reviver)
</script>
| المعلمة | الوصف |
|---|---|
text |
سلسلة JSON |
reviver |
دالة تحويل تطبق على كل زوج مفتاح-قيمة |
مثال: فك التسلسل
HTML
<div id="output" style="white-space: pre; font-family: monospace; padding: 10px; border: 1px solid #ccc; direction: ltr; text-align: left;"></div>
<script>
const output = document.getElementById('output');
const jsonStr = '{"name":"تشارلي","age":30,"hobbies":["القراءة","البرمجة"]}';
const obj = JSON.parse(jsonStr);
output.textContent = 'نتيجة التحليل:\n';
output.textContent += 'الاسم: ' + obj.name + '\n';
output.textContent += 'العمر: ' + obj.age + '\n';
output.textContent += 'الهوايات: ' + obj.hobbies.join('، ') + '\n\n';
const arr = JSON.parse('[1, 2, 3, 4, 5]');
output.textContent += 'مصفوفة محللة: ' + arr + '\n';
output.textContent += 'مجموع المصفوفة: ' + arr.reduce(function(a, b) { return a + b; }, 0);
</script>
JSON مقابل كائن JS
| المقارنة | JSON | كائن JS |
|---|---|---|
| الطبيعة | سلسلة (نص) | هيكل بيانات في الذاكرة |
| اقتباس المفاتيح | مزدوجة الاقتباس مطلوبة | قابلة للحذف (لمعرّفات صالحة) |
| أنواع القيمة | محدودة (6 أنواع) | أي نوع |
| فواصل متدلية | غير مسموح بها | مسموح بها |
| التعليقات | غير مسموح بها | مدعومة (عبر الأدوات) |
💡 طريقة سهلة للتذكر: JSON هو "نسخة سلسلة لكائنات JS مع تحقق صارم." ليس كائناً — هو نص. تحتاج
parse لتحويله إلى كائن يمكنك العمل به.
مثال: أخطاء JSON الشائعة
<div id="output" style="white-space: pre; font-family: monospace; padding: 10px; border: 1px solid #ccc; direction: ltr; text-align: left;"></div>
<script>
const output = document.getElementById('output');
function tryParse(str, label) {
try {
JSON.parse(str);
output.textContent += label + ': ✅ نجح\n';
} catch (e) {
output.textContent += label + ': ❌ ' + e.message + '\n';
}
}
tryParse("{'name':'توم'}", 'مفتاح مفرد الاقتباس');
tryParse('{"name":"توم",}', 'فاصلة متدلية');
tryParse('{"name":undefined}', 'قيمة undefined');
tryParse('{"name":"توم"}', 'JSON صالح');
tryParse('{"a":1,"b":2}', 'JSON صالح (بدون مسافات)');
</script>
💡 الأخطاء الثلاثة الأكثر شيوعاً في JSON: الاقتباسات المفردة، الفواصل المتدلية، و
undefined. عند تصحيح مشكلات JSON، الصقه في وحدة تحكم المتصفح مع JSON.parse() — رسالة الخطأ ستحدد الموقع بالضبط.
📖 ملخص
- JSON هو صيغة بيانات مبنية على السلاسل — المفاتيح يجب أن تكون مزدوجة الاقتباس، بدون فواصل متدلية، أنواع قيم محدودة
JSON.stringify()يسلسل،JSON.parse()يفك التسلسل — عمليات معكوسةundefined، الدوال، و الرموز تتجاهل أو تصبحnullأثناء التسلسل- معلمة
spaceفيJSON.stringifyتجعل الإخراج مقروءاً؛ معلمةreplacerتصفّي الحقول - تحليل JSON غير صالح يطرح استثناء — لفه دائماً في
try/catch
❓ أسئلة شائعة
س لماذا
JSON.stringify(NaN) يُرجع null؟ج مواصفة JSON ليس لديها
NaN، Infinity، أو -Infinity — جميعها تصبح null أثناء التسلسل. إذا كنت بحاجة للحفاظ على هذه القيم، استخدم دالة replacer مخصصة.س هل يمكن لـ
JSON.parse تحليل حرفيات كائن JS؟ج لا.
JSON.parse('{}') يعمل، لكن JSON.parse('{a:1}') يطرح خطأ — المفتاح يفتقر إلى الاقتباس المزدوج. صيغة JSON أكثر صرامة من حرفيات كائن JS.س هل يمكنك كتابة تعليقات في JSON؟
ج JSON القياسي لا يدعم التعليقات. إذا لزم الأمر، استخدم حقلاً مثل
"_comment": "وصف" كحل بديل، على الرغم من أن هذا ليس اتفاقية رسمية.📝 تمارين
- أساسي: أنشئ مصفوفة من 3 كائنات طلاب ونسّق الإخراج بـ
JSON.stringify(مسافة بادئة من مساحتين). - متوسط: اكتب دالة
safeParse(str)تلتفJSON.parseفيtry/catch، تُرجع النتيجة عند النجاح أوnullمع رسالة خطأ عند الفشل. - تحدي: ابنِ "دفتر ملاحظات محلي" — استخدم
promptللإدخال، احفظ فيlocalStorageبـJSON.stringify، وحمّل/اعرضه عند تحميل الصفحة بـJSON.parse.



