تهريب نصوص 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 أصلًا، أو أنه بُتِر في المنتصف.
هل يُرسَل نصي إلى أي مكان؟
لا. يعمل التهريب وفك التهريب كلاهما بالكامل في متصفحك، فلا تغادر الرموز المميزة والحمولات وأسطر السجلات جهازك أبدًا.