العمل مع JSON
الدرس السابق كان يقلب شكل النداء فقط، وthis يتبع ذلك النداء. هذه الصفحة تترك ذلك جانبًا. السلعة ما زالت في الذاكرة، والاسم والسعر على الكائن نفسه. إن أردت تسليم هذه الوقائع إلى ملف أو برنامج آخر أو صفحة لاحقة، فأنت تحتاج نصًا له عقد واضح. اسم هذا النص JSON.
الكائن الحي ليس هذه المذكرة
ما دام السكربت يعمل، يبقى الحرفي في مكانه ويمكنك وضع دالة عليه، وthis ما زال يتبع شكل النداء كما في الدرس السابق. JSON مجرد سلسلة: لا دوال فيها، ولا تختار this بنفسها.
ماذا يُسمح للنص أن يحمل
📊 الكائن الحي مقابل نص JSON
| الجزء | حرفي الكائن | نص JSON |
|---|---|---|
| اقتباس المفتاح | اختياري | اقتباس مزدوج إلزامي |
| اقتباس السلسلة | مفرد أو مزدوج | مزدوج فقط |
| الفاصلة الأخيرة | مسموحة | ممنوعة |
| الدالة | يمكن أن تكون دالة كائن | يحذفها stringify، وكتابتها داخل النص غير صالحة |
| حقل undefined | قيمة حقيقية | يُحذف حين يمشي stringify على الكائن |
لا تنقل عادات الحرفي إلى هذا النص. كل مفتاح وكل سلسلة يحتاج علامة اقتباس مزدوجة. الفاصلة الزائدة في آخر السطر، والتعليق داخل النص، والدالة العارية، كلها ليست JSON صالحًا. الجدول يبيّن أي عادة تُحذف وأيها يرفضها parse أصلًا.
let product = {
name: "Mug",
price: 12
};
console.log(JSON.stringify(product));
stringify يكتب المذكرة
JSON.stringify يمشي على الحقول البسيطة ويعيد سلسلة واحدة، والكونسول يعرض {"name":"Mug","price":12} بينما product نفسه لا يتغير. الاسم ما زلت تقرأه من الكائن الحي فتحصل على Mug. السلسلة قيمة مستقلة يمكنك حفظها أو إرسالها.
let text = '{"name":"Mug","price":12}';
let product = JSON.parse(text);
console.log(product.name);
parse يبني قيمة من المذكرة
text ما زال سلسلة، بعلامات الاقتباس والأقواس. JSON.parse يبني من هذا النص كائنًا جديدًا. بعد ذلك يصبح product.name مساويًا لـ Mug. لا استدعاء دالة هنا ولا دور لـ this.
let text = '{"name":"Mug","tags":["ceramic","gift"]}';
let product = JSON.parse(text);
console.log(product.tags[0]);
القائمة يمكن أن تسكن داخل المذكرة
نص JSON يستطيع حمل مصفوفة، وبعد parse يصبح product.tags مصفوفة حقيقية وأول خانة فيها ceramic. المصفوفة موضوع الدرس القادم، وهنا هي مجرد حمولة داخل النص.
let product = {
name: "Mug",
price: undefined,
tag() {
return this.name;
}
};
console.log(JSON.stringify(product));
المذكرة تحفظ البيانات لا السلوك
price كان undefined. tag كانت دالة. كلاهما يختفي من النص. المطبوع هو {"name":"Mug"} فقط. السلوك يبقى على الكائن الحي ولا يدخل المذكرة.
let text = "{name:'Mug'}";
try {
JSON.parse(text);
console.log("ok");
} catch (err) {
console.log("bad text");
}
المذكرة المرتخية لا تُحلَّل
الاقتباس المفرد والمفتاح بلا اقتباس مسموحان في حرفي الكائن وممنوعان في JSON، لذلك يرمي JSON.parse خطأ وتطبع كتلة catch العبارة bad text بدل أن تتعطل الصفحة في هذا العرض. أصلح النص باقتباس مزدوج على المفتاح وعلى السلسلة. هذا ليس درس الأخطاء اللاحق، بل يبيّن فقط أن JSON التالف يوقف parse.
إذا عرفت الاتجاه عرفت الأداة
من الذاكرة إلى النص تمضي بـ stringify، ومن النص إلى القيمة تعود بـ parse. إن احتجت دالة على السلعة لاحقًا فأضفها بعد parse لأن المذكرة لم تحمل الدالة معها. this ما زال يعتمد على شكل النداء لا على JSON، والدرس التالي هو المصفوفات: قائمة حية في السكربت، لا قاعدة JSON جديدة.
اعرض حقلًا واحدًا من المذكرة
حلّل سلسلة سلعة صغيرة. اكتب الاسم في الفقرة. لا تبنِ الكائن بأقواس داخل السكربت.
<!DOCTYPE html>
<html>
<head>
<title>json — page</title>
</head>
<body>
<p id="line">…</p>
<script>
let text = '{"name":"Mug","price":12}';
let product = JSON.parse(text);
let box = document.getElementById("line");
box.textContent = product.name;
</script>
</body>
</html>
تُظهر الفقرة Mug لأن السكربت حلّل النص ولم يبنِ حرفي كائن. غيّر الاسم داخل السلسلة ثم حدّث الصفحة فيتبع السطر الاسم الجديد.
خطوات التدريب
- نفّذ stringify على الكوب واقرأ النص المقتبس، ثم parse للشكل نفسه حتى ترى
Mug. - حلّل المذكرة التي فيها
tagsواقرأceramic. - نفّذ stringify على كائن فيه دالة وسعر
undefinedحتى يبقىnameفقط، وضع مذكرة بمفتاح بلا اقتباس داخلtry/catchليُطبعbad text. - في مثال HTML غيّر الاسم داخل السلسلة فقط، حدّث، واقرأ الفقرة.
زلات شائعة
- معاملة نص JSON كأنه حرفي كائن، وتمرير اقتباس مفرد أو مفتاح عارٍ إلى
parse - توقع أن تنجو الدالة أو
undefinedمنstringify - استدعاء
parseحين كنت تريد نصًا، أوstringifyوالنص جاهز أصلًا، ثم قراءة الاسم من السلسلة نفسها بدل القيمة التي بناهاparse - ظنّ أن الصفحة التالية ما زالت JSON، بينما المصفوفة قائمة حية
الخلاصة
- JSON نص يصف البيانات و
stringifyيحوّل الكائن البسيط إلى ذلك النص parseيعيد النص إلى قيمة- المفتاح والسلسلة يحتاجان اقتباسًا مزدوجًا، والفاصلة الزائدة أو الاقتباس المفرد يُسقط
parse - الدالة وحقل
undefinedيُحذفان من النص - حقل بعد parse يستطيع ملء سطر في الصفحة، والدرس التالي المصفوفات، قائمة حية داخل السكربت
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى