JSON يحمل كائنات داخل كائنات داخل مصفوفات، إلى أي عمق. برنامج الجداول يحمل صفوفًا وأعمدة لا غير. التحويل ليس تغيير صيغة، بل إعادة بناء، وكل إعادة بناء ترمي شيئًا.
المحوّلات التي تعد بفعلها تلقائيًّا تختار نيابةً عنك. معرفة الاختيار الذي اتّخذته هي الفرق بين ملف نافع وثلاثين ألف عمود.
أولًا: ما الصف؟
كل شيء ينبع من هذا، وهو السؤال الذي يتخطّاه الناس.
استجابة تحوي طلبات، كل طلب فيه عدّة بنود، يمكن أن تصير صفًّا لكل طلب أو صفًّا لكل بند. كلاهما صحيح. أحدهما صحيح لحساب الإيرادات بحسب العميل؛ والآخر صحيح لحساب الوحدات بحسب المنتج.
اختر مستوى الشيء الذي ستعدّه. بقيّة المستند تصير عندئذٍ إما أعمدة على ذلك الصف أو مكرّرة عليه.
الكائنات المتداخلة: المسارات المنقّطة
الكائن داخل كائن يُسطَّح بنظافة. عميل له عنوان يحوي مدينة يصير عمودًا اسمه customer.address.city.
هذا الجزء بلا لبس وقابل للعكس. الثمن الوحيد أسماء أعمدة تطول، ثم الإزعاج البسيط أن مفتاحًا يحوي نقطة يصير لا يُميَّز عن مستوى تداخل.
المصفوفات: القرار الحقيقي
ثلاث استراتيجيات، ولا محوّل يستطيع الاختيار عنك، لأن الجواب الصحيح يتوقّف على ما ستفعله بعد ذلك.
التفكيك. صف لكل عنصر في المصفوفة، مع تكرار حقول الأب على كل صف. طلب فيه ثلاثة بنود يصير ثلاثة صفوف تحمل رقم الطلب نفسه. هذا ما ينتجه ربط قاعدة بيانات، وهو ما تتوقّعه الجداول المحورية. الثمن أن الملف لم يعد فيه صف واحد لكل طلب، فجمع عمود على مستوى الطلب يعدّه ثلاث مرّات.
التوسيع. عمود لكل موضع: tags.0 وtags.1 وtags.2. حسن حين يكون لكل سجلّ العدد الصغير نفسه من العناصر، وكارثي عدا ذلك — فعدد الأعمدة تحدّده أطول مصفوفة منفردة في المستند، وكل صف آخر يترك تلك الأعمدة فارغة.
الدمج. المصفوفة كلّها في خليّة واحدة تفصلها فواصل منقوطة. مضغوطة ويقرؤها الإنسان؛ لم تعد تُقرأ للآلة، وتنكسر إن حوت أي قيمة الفاصل.
فكّك حين تكون العناصر هي ما يهمّك. ادمج حين تكون المصفوفة وصفية — وسوم، وتسميات، وفئات. لا توسّع تقريبًا أبدًا.
ما لا يستطيع برنامج الجداول تمثيله
الأنواع. لا أنواع في CSV. الرقم، والسلسلة التي تحوي أرقامًا، والقيمة المنطقية، كلّها تصير نصًّا، وما يفتح الملف يخمّن من جديد من الصفر — وهناك تختفي الأصفار البادئة وتصير الرموز تواريخ.
null مقابل الغائب مقابل الفارغ. ثلاث حالات مختلفة في JSON، خليّة فارغة واحدة في برنامج الجداول. إن كان الفرق مهمًّا، فرمّزه عن قصد.
الترتيب والهويّة. ما إن تُفكَّك مصفوفة حتى لا يبقى في الملف ما يقول إن تلك الصفوف كانت لسجلّ واحد. إبقاء معرّف الأب على كل صف هو ما يتيح لأي أحد إعادة تركيبها.
الكائنات المتفاوتة
نادرًا ما تحمل استجابات واجهات البرمجة الحقيقية المفاتيح نفسها في كل سجلّ — فالحقول الاختيارية غائبة لا null، وأنواع السجلّات المختلفة تحمل حقولًا مختلفة.
التسطيح يجمع كل مسار مختلف عبر المستند كلّه في مجموعة الأعمدة، فحفنة سجلّات غير معتادة توسّع الملف على الجميع. ألف سجلّ في كل واحد ثمانية حقول، وسجلّ واحد فيه أربعون، ينتج ملفًّا من أربعين عمودًا.
يستحقّ الأمر أن تقارن عدد الأعمدة بعدد الحقول الذي توقّعته قبل أن تفعل أي شيء آخر بالنتيجة.
كيف تفعلها
المحوّل يتولّى الميكانيكا ما إن تقرّر مستوى الصف واستراتيجية المصفوفات. تنسيق JSON أولًا يستحقّ الخطوة الزائدة — فلا تستطيع اختيار مستوى صف من مستند مصغّر، وقراءة الشكل هي معظم العمل.
فعلها في المتصفّح يهمّ هنا أكثر ممّا يهمّ في معظم التحويلات، لأن JSON الذي يحتاج التسطيح يكون عادةً استجابة واجهة برمجية تحوي سجلّات عملاء.
الخلاصة
قرّر ما هو الصف الواحد قبل أي شيء آخر. الكائنات المتداخلة تصير أعمدة منقّطة، وذلك الجزء آمن. المصفوفات هي القرار الحقيقي: فكّك حين تهمّ العناصر، وادمج حين تكون تسميات، وعامل CSV تصديرًا لا مصدرًا.