data · 7 دقائق قراءة

JSON أم YAML أم TOML — أيّها لأي غرض

الثلاث تخزّن الأشكال نفسها ولا تتنافس. واحدة للآلات تكلّم الآلات؛ والاثنتان الأخريان لأناس يحرّرون ملفًّا.

الثلاث تصف الشيء نفسه: خرائط متداخلة وقوائم من السلاسل والأرقام والقيم المنطقية. التحويل بينها آلي. فالاختيار ليس عن القدرة، بل عمّن سيكتب.

JSON للنقل

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

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

لاستجابة واجهة برمجية، أو سطر سجلّ، أو أي شيء تكتبه آلة، هذا صحيح تمامًا.

YAML للتحرير

الإزاحة تحلّ محلّ الأقواس المعقوفة، وعلامات الاقتباس اختيارية غالبًا، والتعليقات مسموحة، والسلاسل الطويلة يمكن كتابتها على أسطر عدّة بلا تهريب. ملف YAML يُقرأ كمستند، ولهذا استولى على الإعدادات.

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

استنتاج الأنواع الذي لا يكفّ عن إيقاع الناس

هذا هو الشيء المحدّد الجدير بمعرفته قبل أن تكتب أي YAML.

القيمة غير المقتبَسة تُؤوَّل لا تُؤخذ حرفيًّا. تحت YAML 1.1 — وهو ما زال ما تطبّقه محلّلات كثيرة منشورة — تصير NO قيمة منطقية false، فيتحوّل رمز دولة النرويج إلى false على نحو لا يُنسى. ON وOFF وYES وY قيم منطقية أيضًا.

الأرقام أسوأ. إصدار مكتوب 1.20 يصير الرقم 1.2 ويفقد صفره اللاحق. قيمة تبدأ بصفر قد تُقرأ ثمانيّة. شيء مثل 6e2 — وهو بداية معقولة لبصمة git — يصير 600. عنوان MAC بنقطتيه الرأسيتين يمكن أن يُقرأ رقمًا ستّينيًّا.

العلاج محرف واحد: اقتبس كل ما يُقصد به سلسلة نصّية. يستحقّ أن يكون سلوكك الافتراضي لا أن تفعله حين تنتبه.

TOML للإعدادات المسطّحة في معظمها

تعليقات، وقواعد واضحة، ولا مسافات بيضاء ذات معنى، ولا استنتاج أنواع يفاجئك — القيم تعني ما تقوله. لملف إعدادات تطبيق، هي أسهل الثلاث ضبطًا.

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

كيف تختار

آلة تكتبه وآلة تقرؤه — JSON. الأسرع تحليلًا، مدعوم في كل مكان، بلا لبس.

إنسان يحرّره وله بنية حقيقية — YAML. خطوط المعالجة، وعمليات النشر، وكل ما فيه قوائم خطوات.

إنسان يحرّره وهو إعدادات في معظمه — TOML.

يجب أن يقرأه الاثنان — JSON، مع توليد الإعدادات من شيء آخر. صيانة JSON باليد هي الموضع الذي يؤلم فيه غياب التعليقات أشدّ ما يكون.

التحويل بينها

التحويل يفقد شيئًا في اتّجاه واحد لا غير: التعليقات لا تنجو. تحويل YAML إلى JSON يرمي كل ملاحظة شارحة في الملف، والتحويل عكسًا لا يعيدها.

هذا يستحقّ القول لأنه غير بديهي ولا رجعة فيه. إن كان ملف YAML موثّقًا — والجيّد منها موثّق — فعامله مصدرًا وولّد منه JSON، بدل الذهاب والإياب.

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

الخلاصة

JSON للنقل، وYAML لإعدادات مبنيّة يصونها إنسان، وTOML للإعدادات. اقتبس سلاسل YAML عندك. تذكّر أن التحويل بعيدًا عن YAML يرمي التعليقات إلى غير رجعة.

أسئلة

ما الفرق بين JSON وYAML؟

JSON صيغة تبادل بيانات: صارمة، لا لبس فيها، بلا تعليقات، ويسهل على الآلة إنتاجها وتحليلها. أما YAML فلغة إعدادات: إزاحة بدل الأقواس المعقوفة، وتعليقات مسموحة، وقواعد أكثر تسامحًا بكثير — وهذا ما يجعلها مريحة في التحرير وأصعب في ضبطها تمامًا.

هل YAML مجموعة أشمل من JSON؟

منذ YAML 1.2، نعم في الجوهر — فالمستند JSON الصالح صالح كـYAML، أي أن محلّل YAML سيقرأ ملف JSON عندك. العكس غير صحيح، ومن السهل الاتّكال على هذا التوافق أكثر ممّا ينبغي، لأن محلّلات YAML 1.1 ما زالت منشورة على نطاق واسع وتختلف في المواضع المحرجة بالذات.

لماذا حوّل YAML قيمتي إلى true أو إلى رقم؟

YAML يستنتج الأنواع من القيم غير المقتبَسة. في المحلّلات الأقدم يصير رمز الدولة NO قيمة منطقية false، وتصير ON وYES قيمة true، ويفقد إصدار مثل 1.20 صفره اللاحق، ويمكن أن يُقرأ عنوان MAC أو بصمة git رقمًا بالصيغة العلمية. اقتباس القيمة يوقف ذلك كلّه.

هل أستطيع وضع تعليقات في JSON؟

لا. المواصفة بلا قواعد للتعليقات، وهذا مقصود، وهو أكبر سبب منفرد يجعل JSON غير مريح صيغةَ إعدادات. JSON5 وJSONC تضيفانها وليستا JSON، فكل ما يستهلك ملفّك عليه أن يختارهما صراحةً.

هل أستعمل TOML بدلًا منهما؟

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

أدوات من هذا الدليل

المزيد من أدوات البيانات — كلّها تعمل في متصفّحك، ولا واحدة منها ترفع ملفًّا.