تقنية

تحويل JSON المتداخل إلى جدول: كيف نحفظ علاقة الأب والعناصر؟

صندوق افتراضي واحد ص7 يتصل بصف اللوح وصف الزاوية مع بقاء معرف الأب نفسه
رسم أصلي لعلاقة أب بعنصرين، يوضح وحدة الصف دون ادعاء تنفيذ تحويل.

تحويل JSON المتداخل إلى جدول يغير طريقة تنظيم الحقول. توفر pandas الدالة json_normalize، مع record_path لاختيار قائمة السجلات وmeta لإضافة حقول من سياقها إلى الصفوف الناتجة. لكن اختيار الوحدة والعلاقة المناسبة يبقى قرارا يخص البيانات والمهمة. [1]

الخلاصة السريعة

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

  • يمكن تسطيح الحقول بأسماء تعكس مساراتها؛ احتفظ بتفسير الاسم ولا تدمج مسارين مختلفين في اسم مبهم. [1]
  • في صندوق افتراضي ذي عنصرين، صفا العناصر يصفان صندوقا واحدا؛ كرر معرفه لحفظ العلاقة ولا تعده صندوقين.
  • إجمالي الصندوق المكرر للسياق ليس كمية جديدة لكل عنصر؛ جمعه في الصفين يضاعف قيمة المثال خطأ.
  • راجع السجلات الأصلية وقوائمها الفارغة أو الغائبة والمسارات الناتجة، ووثق وحدة الصف قبل تجهيز مدخلات النموذج.

ما الذي يحدث لأسماء الحقول المتداخلة؟

توضح وثائق pandas أن sep يفصل أجزاء اسم الحقل المتداخل، مثل تحويل مسار داخل كائن إلى اسم بنقطة. [1]

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

كيف يبقى عنصران تابعين لصندوق واحد؟

لنفترض أن الصندوق الافتراضي ص7 يضم قطعتين: لوحا وزاوية. نقرر إنشاء صف لكل عنصر مع معرف الصندوق، بدلا من صف واحد للصندوق كله. الجدول يبين تمثيل العلاقة المقترح، ولم نشغل json_normalize لإنتاجه.

إذا قرأنا الصف الثاني وحده، يساعد المعرف على معرفة أنه تابع للصندوق نفسه. ويمكن أيضا حفظ موضع العنصر أو معرفه إذا احتجنا تمييزه داخل القائمة. عدد الصفوف هنا اثنان لأننا اخترنا عنصر الصندوق وحدة للصف؛ أما عدد الصناديق الممثلة فهو واحد.

معرف الصندوقالعنصرإجمالي قطع الصندوق للسياق
ص7لوح2
ص7زاوية2

لماذا لا نجمع إجمالي الأب في كل صف؟

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

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

ما الذي نراجعه بعد التسطيح؟

نقترح مقارنة معرفات الصناديق الأصلية بمعرفات الناتج، وأعداد العناصر المعروفة بقوائمها. نعطي سياسة منفصلة للصندوق الذي لا عناصر له وللصندوق الذي لم تصل قائمته؛ فقد لا يظهر سجل أب بلا عناصر في جدول اخترنا فيه العناصر وحدة للصف. لذلك نحفظ جدول الآباء أو حالة مناسبة إذا احتاجت المهمة تمثيله.

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

المصادر ومتابعة القراءة

  1. pandas: json_normalize (يفتح في نافذة جديدة)pandas.pydata.org

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.