تحويل JSON إلى نص / فك التحويل

حوّل كائن JSON إلى سلسلة نصية محاطة بعلامات اقتباس مهرّبة (escaped) لتضمينه في الكود، أو فك تهريب سلسلة JSON نصية لإعادتها إلى JSON قابل للقراءة.

1,011 مشاهدة

كيف تعمل الأداة

يأخذ Stringify JSON حقيقيًا ويحوّله بالتهريب إلى سلسلة نصية من سطر واحد بعلامات اقتباس مهرّبة — وهو الشكل الذي تحتاجه عند تضمين JSON داخل حقل JSON آخر، أو قيمة إعداد، أو ثابت نصي في الكود المصدري. هذا داخليًا هو بالضبط ما تفعله دالة JSON.stringify() في جافاسكريبت: تتجول عبر القيمة، وتضع الاقتباسات حول السلاسل النصية، وتُهرّب أحرف التحكم وعلامات الاقتباس المضمّنة، وتُسلسل الكائنات والمصفوفات إلى نص. أما Unstringify فيعكس ذلك: ألصق سلسلة JSON مهرّبة (تحتوي على \" و\n) واحصل على JSON نظيف، قابل للقراءة، ومنسّق بمسافات بادئة — وهذا يعادل استدعاء JSON.parse() عليها ثم طباعة النتيجة بشكل منسّق.

مثال ملموس: يتحوّل الكائن {"name":"Ada","tags":["a","b"]} إلى السلسلة النصية "{\"name\":\"Ada\",\"tags\":[\"a\",\"b\"]}" — تحصل كل علامة اقتباس مزدوجة داخلية على شرطة مائلة عكسية أمامها، بحيث يمكن للكل أن يعيش داخل زوج واحد خارجي من علامات الاقتباس. هذا بالضبط ما يحدث عندما تُغلّف واجهة API حمولة JSON كسلسلة نصية داخل استجابة JSON أخرى (جسم webhook، سطر سجل، عمود قاعدة بيانات من نوع نصي)، أو عندما يجب إدراج قيمة JSON داخل ملف YAML أو متغيّر بيئة أو ثابت نصي في الكود المصدري دون كسر الصياغة المحيطة. يقوم Unstringify بالعكس: ألصق تلك الكتلة المهرّبة واحصل على الأصل منسّقًا وقابلًا للقراءة.

تستحق بعض سلوكيات JSON.stringify() المعرفة حتى لو لم تستخدم هذه الأداة بالذات: تُحذف قيم undefined والدوال بصمت من خصائص الكائن (يختفي المفتاح الذي تكون قيمته undefined ببساطة)، لكن نفس القيم داخل مصفوفة تُحوَّل إلى null بدلاً من حذفها، لأن المصفوفات يجب أن تحافظ على طولها ومواضع فهارسها سليمة. لا تُسلسَل كائنات Date ككائنات — بل تُحوَّل عبر طريقتها toJSON() إلى سلسلة بصيغة ISO 8601 مثل "2024-01-15T10:30:00.000Z". أما القيمة التي تحتوي على مرجع دائري (circular reference) — كائن يشير إلى نفسه، مباشرة أو عبر سلسلة من الخصائص — فلا يمكن تحويلها إلى نص إطلاقًا: تُطلق JSON.stringify() الحقيقية خطأ TypeError: Converting circular structure to JSON، لأنه لا توجد سلسلة نصية محدودة يمكنها تمثيل بنية متداخلة إلى ما لا نهاية.

ما يجب أن تعرفه

التحويل إلى نص عملية فيها فقدان بمعنى محدد: كل ما يُحذف بصمت (الدوال، خصائص undefined، مفاتيح Symbol) لا يمكن استعادته لاحقًا عبر فك التحويل — فالرحلة ذهابًا وإيابًا تحافظ فقط على ما يمكن لـJSON صالح تمثيله أصلًا، وهو السلاسل النصية والأرقام والقيم المنطقية وnull والكائنات والمصفوفات العادية. في الكود الحقيقي، تقبل JSON.stringify() أيضًا وسيطين إضافيين إلى جانب القيمة نفسها: replacer (دالة أو مصفوفة من أسماء المفاتيح تتحكم بدقة في الخصائص التي تُدرَج، أو كيفية تحويل قيمها قبل التسلسل)، ووسيط space (رقم أو سلسلة نصية يحوّل المخرجات المضغوطة من سطر واحد إلى JSON منسّق بمسافات بادئة وسهل القراءة للبشر — وهذا بالضبط الفرق بين استجابة API مصغّرة والنسخة المنسّقة التي تعرضها لك أداة تصحيح الأخطاء).

يُعدّ JSON المُرمَّز مرتين مصدرًا شائعًا للالتباس: إذا بدت قيمة ما وكأنها سلسلة JSON نصية لكن أول حرف فيها هو علامة اقتباس وهي مليئة بعلامات اقتباس داخلية مهرّبة بشرطة مائلة عكسية، فمن المرجح أنها حُوِّلت إلى نص مرتين — مرة بواسطة التطبيق، ومرة أخرى بواسطة طبقة لم تدرك أن الحمولة كانت بالفعل سلسلة JSON نصية. تمريرها عبر Unstringify مرة واحدة يحل الطبقة الخارجية؛ وإذا بدت النتيجة لا تزال مهرّبة، كرر العملية مرة أخرى.

الأسئلة الشائعة

ما الفرق عن JSON.stringify في الكود؟

العملية ذاتها، لكن كأداة تفاعلية: ألصق JSON حقيقياً واحصل على الشكل النصي المهرّب الذي كنت ستنتجه بكتابة JSON.stringify(obj) — مفيدة عندما لا تتوفر وحدة تحكم (console) في متناولك.

متى أحتاج إلى فك تهريب (unstringify) JSON؟

تُضمّن واجهات API والسجلات أحياناً سلسلة JSON داخل حقل JSON آخر (ترميز مزدوج) — يعيد Unstringify تلك السلسلة المهرّبة الداخلية إلى JSON قابل للقراءة والتحليل.

لماذا اختفت إحدى الخصائص بعد التحويل إلى نص؟

تُهمل JSON.stringify() بصمت خصائص الكائن التي تكون قيمتها undefined أو دالة — فلا يوجد تمثيل JSON لأي منهما، لذا يُحذف المفتاح تمامًا بدلاً من تسلسله كـnull. أما نفس قيمة undefined داخل مصفوفة فتتحوّل إلى null بدلاً من الاختفاء، لأن المصفوفات يجب أن تحافظ على طولها وترتيب فهارسها.

لماذا أحصل على خطأ "بنية دائرية" (circular structure)؟

إذا كان كائن ما يشير إلى نفسه، مباشرة أو عبر سلسلة من كائنات أخرى، فلن تستطيع JSON.stringify() إنتاج سلسلة نصية محدودة له وستُطلق خطأ TypeError. هذا شائع عند تسلسل كائنات تحمل مرجعًا عكسيًا إلى أصلها (عقدة فرعية تشير إلى شجرتها، عنصر DOM، نسخة صنف بها حقل "self") — والحل هو حذف الخاصية الدائرية أو استبدالها قبل التسلسل، غالبًا باستخدام دالة replacer.

هل تُرفَع بياناتي إلى أي مكان؟

لا — يعمل الاتجاهان كلاهما محلياً داخل متصفحك.

التعليقات

لا توجد تعليقات بعد — كن أول من يكتب تعليقًا!

أدوات مشابهة