هروب نصوص JSON

هروب النص ليكون صالحًا داخل سلسلة JSON، أو فكّ هروب نص هارب ليعود إلى ما يقوله — مع مواضع أخطاء دقيقة.

نص
هارب

سيظهر الإخراج هنا

ما الذي تفعله هذه الأداة

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

والاتجاه الثاني هو ما يجلب الناس إلى هنا عادةً: سطر سجل، أو رسالة خطأ، أو استجابة curl وصلت كجدار من الشرطات المائلة الخلفية. كل شيء يعمل في متصفحك، وهذا مهم حين يكون ما تحاول قراءته استجابة من بيئة الإنتاج.

تسلسلات الهروب

يعرّف JSON قائمة قصيرة من تسلسلات الهروب، وتستخدم الأداة هذه القائمة بالضبط — لا شيء أغرب منها، لأن أي شيء آخر ليس JSON صالحًا.

  • ‎\"‎ — علامة اقتباس مزدوجة، وإلا لأنهت السلسلة.
  • \\ — شرطة مائلة خلفية واحدة. ولهذا تتضاعف مسارات Windows وأنماط التعابير النمطية.
  • ‎\n و‎\r — سطر جديد وإرجاع المؤشر.
  • ‎\t — Tab. ويوجد أيضًا ‎\b و‎\f، للمسح للخلف وتغذية الصفحة.
  • ‎\/‎ — هروب اختياري للشرطة المائلة الأمامية. صالح، وغير مطلوب أبدًا؛ تقبله الأداة ولا تنتجه إطلاقًا.
  • ‎\uXXXX — أي حرف عبر رمزه الست عشري، وهي طريقة كتابة أحرف التحكم وكل ما هو خارج ASCII.

أما أحرف التحكم — كل ما دون الرمز 32 — فليس لها شكل حرفي داخل سلسلة JSON أصلًا، ولذلك تخرج دائمًا على هيئة ‎\uXXXX حتى لو لم تطلب إخراج ASCII.

لماذا تتكاثر الشرطات المائلة الخلفية

أكثر الأسباب شيوعًا للجوء إلى أداة كهذه هو نص جرى هروبه أكثر من مرة. فكل جولة ترميز تهرب الشرطات المائلة الخلفية التي أدخلتها الجولة السابقة، فتنمو لعلامة اقتباس واحدة ذيلٌ أطول فأطول:

original    He said "hi"
escaped     He said \"hi\"
escaped x2  He said \\\"hi\\\"

يحدث ذلك حين يُسلسَل قيمةٌ إلى JSON، ثم يُخزَّن ذلك JSON كسلسلة داخل مستند JSON آخر، ثم تُسجَّل النتيجة. فك الهروب مرة واحدة يزيل طبقة واحدة؛ أعد التشغيل على الناتج حتى يُقرأ النص بشكل طبيعي. وإذا فككت الهروب وبقيت شرطات شاردة، فتلك طبقة إضافية حقيقية لا خلل في التحويل.

علامتا الاقتباس: قيمة أم جزء

قيمة سلسلة JSON الكاملة تتضمن علامتي الاقتباس المزدوجتين المحيطتين. لكنك في معظم الأحيان تلصق داخل سلسلة موجودة أصلًا في كودك أو إعداداتك، وهناك تكون تلك العلامتان خطأً. لذلك ينتج الهروب افتراضيًا المحتوى الهارب وحده، ويضيفهما خيار «تضمين علامتي الاقتباس المحيطتين» حين تريد قيمة تلصقها كاملة.

أما فك الهروب فلا يحتاج مثل هذا الاختيار — فهو يقبل الصيغتين. الصق جزءًا أو الصق قيمة كاملة بين علامتي اقتباس مأخوذة مباشرة من مستند JSON، وستُميَّز العلامتان المحيطتان وتُزالان.

يونيكود، ومتى تهربه رغم ذلك

JSON صيغة يونيكود. فـ«שלום» و«😀» سلسلتان صالحتان تمامًا كما كُتبتا، وإبقاؤهما مقروءتين هو السلوك الافتراضي هنا. أما خيار ‎\uXXXX فموجود من أجل الأنظمة التي لم تواكب: مسارات السجلات القديمة، والطرفيات، والمحلّلات التي تفترض ASCII وتشوّه ما عداه.

وثمة تفصيل مهم حين يكون ذلك الخيار مفعّلًا. فالأحرف خارج النطاق الأساسي — ومعظم الرموز التعبيرية منها — تُخزَّن داخليًا كوحدتين تُسمّيان زوجًا بديلًا، ويشترط الشكل كتابة النصفين كتسلسلَي هروب منفصلين. لذا يصير الرمز التعبيري تسلسلَي ‎\u لا تسلسلًا واحدًا أطول. والأدوات التي تخطئ هنا تنتج تسلسلات لا يقبلها أي محلّل — وهو التفسير المعتاد للرموز التعبيرية التي تنجو من نظام وتنكسر في التالي.

حين يفشل فك الهروب

ليس كل تسلسل يبدأ بشرطة مائلة خلفية هروبًا صالحًا. فـ‎\q لا تعني شيئًا في JSON، و‎\u12 تسلسل ‎\u ينقصه نصف أرقامه. وبدلًا من تمريرها كما هي وإعادة إخراج يبدو سليمًا لكنه ليس ما قالته بياناتك، تتوقف الأداة وتبلّغ عن السطر والعمود بالضبط حيث يبدأ التسلسل المعطوب.

وعمليًا يكون هذا الخطأ مفيدًا: فـ‎\q الشاردة تعني غالبًا أن النص لم يهرب لـJSON من الأصل، و‎\u المبتورة تعني غالبًا أن المدخل قُطِع — سطر سجل قصّه حدُّ طول، أو نسخة توقفت في منتصف التسلسل.

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

لماذا يمتلئ نصي بـ ‎\\"‎ في كل مكان؟
لأن هروبه جرى أكثر من مرة. كل تمريرة تهرب شرطات التمريرة السابقة، فقد تسبق علامةَ اقتباس أصلية عدةُ شرطات. فُكّ الهروب مرارًا — وكل تشغيل يزيل طبقة واحدة بالضبط — حتى يُقرأ النص بشكل طبيعي.
هل أفعّل علامتي الاقتباس المحيطتين؟
فقط إن أردت قيمة JSON كاملة تلصقها كما هي، مثلًا بوصفها الطرف الأيمن كاملًا لمفتاح. أما إن كنت تلصق داخل سلسلة موجودة في كودك فاتركه معطّلًا، وإلا انتهى بك الأمر إلى علامات اقتباس داخل علامات اقتباس.
هل تحتاج العربية أو العبرية أو الصينية أو الرموز التعبيرية إلى هروب؟
لا. سلاسل JSON يونيكود، فهذه الأحرف صالحة كما هي وتبقى مقروءة افتراضيًا. فعّل خيار ‎\uXXXX فقط حين يصرّ نظام لاحق على ASCII خالص؛ عندئذ تُكتب الرموز التعبيرية بتسلسلَي الهروب البديلين المطلوبين.
ماذا تعني «تسلسل هروب غير صالح»؟
يحتوي المدخل على شرطة مائلة خلفية يتبعها شيء لا يعرّفه JSON، مثل ‎\q، أو ‎\u من دون أربعة أرقام ست عشرية بعدها. ويُبلَّغ عن الموضع لتنظر إلى تلك النقطة تحديدًا: غالبًا لم يكن النص هاربًا لـJSON أصلًا، أو أنه بُتِر في المنتصف.
هل يُرسَل نصي إلى خادم؟
لا. يعمل الهروب وفك الهروب كلاهما بالكامل في متصفحك، فلا تغادر الرموز المميزة والحمولات وأسطر السجلات جهازك أبدًا.

أدوات ذات صلة