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

كيف تحوّل JSON متداخلًا إلى جدول بيانات

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

JSON يحمل كائنات داخل كائنات داخل مصفوفات، إلى أي عمق. برنامج الجداول يحمل صفوفًا وأعمدة لا غير. التحويل ليس تغيير صيغة، بل إعادة بناء، وكل إعادة بناء ترمي شيئًا.

المحوّلات التي تعد بفعلها تلقائيًّا تختار نيابةً عنك. معرفة الاختيار الذي اتّخذته هي الفرق بين ملف نافع وثلاثين ألف عمود.

أولًا: ما الصف؟

كل شيء ينبع من هذا، وهو السؤال الذي يتخطّاه الناس.

استجابة تحوي طلبات، كل طلب فيه عدّة بنود، يمكن أن تصير صفًّا لكل طلب أو صفًّا لكل بند. كلاهما صحيح. أحدهما صحيح لحساب الإيرادات بحسب العميل؛ والآخر صحيح لحساب الوحدات بحسب المنتج.

اختر مستوى الشيء الذي ستعدّه. بقيّة المستند تصير عندئذٍ إما أعمدة على ذلك الصف أو مكرّرة عليه.

الكائنات المتداخلة: المسارات المنقّطة

الكائن داخل كائن يُسطَّح بنظافة. عميل له عنوان يحوي مدينة يصير عمودًا اسمه customer.address.city.

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

المصفوفات: القرار الحقيقي

ثلاث استراتيجيات، ولا محوّل يستطيع الاختيار عنك، لأن الجواب الصحيح يتوقّف على ما ستفعله بعد ذلك.

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

التوسيع. عمود لكل موضع: tags.0 وtags.1 وtags.2. حسن حين يكون لكل سجلّ العدد الصغير نفسه من العناصر، وكارثي عدا ذلك — فعدد الأعمدة تحدّده أطول مصفوفة منفردة في المستند، وكل صف آخر يترك تلك الأعمدة فارغة.

الدمج. المصفوفة كلّها في خليّة واحدة تفصلها فواصل منقوطة. مضغوطة ويقرؤها الإنسان؛ لم تعد تُقرأ للآلة، وتنكسر إن حوت أي قيمة الفاصل.

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

ما لا يستطيع برنامج الجداول تمثيله

الأنواع. لا أنواع في CSV. الرقم، والسلسلة التي تحوي أرقامًا، والقيمة المنطقية، كلّها تصير نصًّا، وما يفتح الملف يخمّن من جديد من الصفر — وهناك تختفي الأصفار البادئة وتصير الرموز تواريخ.

null مقابل الغائب مقابل الفارغ. ثلاث حالات مختلفة في JSON، خليّة فارغة واحدة في برنامج الجداول. إن كان الفرق مهمًّا، فرمّزه عن قصد.

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

الكائنات المتفاوتة

نادرًا ما تحمل استجابات واجهات البرمجة الحقيقية المفاتيح نفسها في كل سجلّ — فالحقول الاختيارية غائبة لا null، وأنواع السجلّات المختلفة تحمل حقولًا مختلفة.

التسطيح يجمع كل مسار مختلف عبر المستند كلّه في مجموعة الأعمدة، فحفنة سجلّات غير معتادة توسّع الملف على الجميع. ألف سجلّ في كل واحد ثمانية حقول، وسجلّ واحد فيه أربعون، ينتج ملفًّا من أربعين عمودًا.

يستحقّ الأمر أن تقارن عدد الأعمدة بعدد الحقول الذي توقّعته قبل أن تفعل أي شيء آخر بالنتيجة.

كيف تفعلها

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

فعلها في المتصفّح يهمّ هنا أكثر ممّا يهمّ في معظم التحويلات، لأن JSON الذي يحتاج التسطيح يكون عادةً استجابة واجهة برمجية تحوي سجلّات عملاء.

الخلاصة

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

أسئلة

كيف أحوّل JSON متداخلًا إلى CSV؟

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

ماذا يحدث للمصفوفات عند تسطيح JSON؟

واحد من ثلاثة. التفكيك: صف لكل عنصر، مع تكرار حقول الأب على كل صف. التوسيع: عمود لكل موضع، tags.0 وtags.1، وهو ينكسر لحظة أن يحمل سجلّ عناصر أكثر من الأعرض الذي خطّطت له. الدمج: المصفوفة كلّها في خليّة واحدة تفصلها فواصل منقوطة، وهي مقروءة للإنسان لكنها لم تعد مقروءة للآلة.

لماذا في ملف CSV المسطّح عندي آلاف الأعمدة؟

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

هل التسطيح قابل للعكس؟

المسارات المنقّطة الآتية من كائنات متداخلة تُعكس بنظافة. أما المصفوفات المفكّكة فلا — فما إن تتكرّر حقول الأب عبر الصفوف حتى لا يبقى في الملف ما يسجّل أن تلك الصفوف كانت سجلًّا واحدًا. أبقِ JSON مصدرًا وعامل CSV تصديرًا.

كيف أتعامل مع null والمفاتيح الغائبة؟

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

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

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