Command Palette

Search for a command to run...

JSON Flattener: تحويل JSON المتداخل إلى مفاتيح تدوين نقطي والعودة

JSON Flattener: تحويل JSON المتداخل إلى مفاتيح تدوين نقطي والعودة

T
Toolz Team
|Aug 23, 2026|16 دقيقة قراءة

جزء من مجموعة أدوات البيانات

بدت المهمة التي علمتني احترام التسطيح مملة على التذكرة: &quot؛ تصدير كائن الإعدادات إلى جدول بيانات حتى يتمكن العميل من تحريره.&quot؛ كانت الإعدادات عبارة عن نقطة JSON متداخلة بعمق من تكوين Laravel، وثلاثة وأربعة مستويات عميقة في بعض الأماكن، مع دمج صفائف من أعلام الميزات. يحتوي جدول البيانات على أعمدة، وليس أشجارًا. كنت بحاجة إلى كل قيمة ورقة كمفتاح مسطح واحد يمكن للعميل رؤيته في صف واحد، وتحريره، وإعادته، ثم كنت بحاجة إلى إعادة بناء البنية المتداخلة الدقيقة من تعديلاتها دون فقدان فهرس مصفوفة واحد. تلك الرحلة ذهابًا وإيابًا، المتداخلة مع المسطحة والمسطحة مرة أخرى إلى المتداخلة، هي ما يفعله جهاز تسطيح JSON، والحصول عليه بدون خسارة هي اللعبة بأكملها. The Toolz مسطح JSON هي الأداة التي صممتها لهذه المهمة، وهذا الدليل يشرح كيفية عملها وأين تنقذك.

ليرة تركية؛DR: يقوم جهاز تسوية JSON بتحويل كائن متداخل إلى كائن أحادي المستوى تكون مفاتيحه هي المسار إلى كل قيمة، لذلك {"user":{"city":"Austin"}} يصبح {"user.city":"Austin"}. تتسطح المصفوفات مع وجود فهرسها في المسار (roles.0). يقوم Unflatten بعكسه، وإعادة بناء الكائنات والمصفوفات المتداخلة من تلك المفاتيح المنقطة. تقوم أداة Toolz بكلا الاتجاهين دون فقدان البيانات، وتحافظ على الكائنات والمصفوفات الفارغة، وتدعم تدوين المصفوفة النقطية أو القوسية ومحدد مخصص، وتعمل بالكامل من جانب العميل بدون تحميل أو تسجيل.

أقوم ببناء SaaS على Laravel وReact وشحن مكونات WordPress الإضافية، لذا فإن JSON المتداخلة موجودة في كل مكان في يومي: ملفات التكوين، وحمولات API، وكتالوجات رسائل i18n، ومخازن علامات الميزات. ومع ذلك، فإن الأنظمة التي تستهلك تلك الحمولات تريد في كثير من الأحيان مفاتيح مسطحة. التسطيح هو المحول بين الشكل الطبيعي للبيانات المنظمة والشكل الطبيعي لجداول البيانات ومتغيرات البيئة ومخازن المفاتيح المنقطة. إنها عملية صغيرة تفتح بهدوء الكثير من المهام المزعجة.

ما هو المسطح JSON؟

يقوم أداة تسطيح JSON بتحويل كائن JSON المتداخل إلى كائن أحادي المستوى حيث يكون كل مفتاح هو المسار الكامل من الجذر إلى قيمة الورقة. بناء جملة المسار ليس عشوائيًا أيضًا: RFC 6901 يحدد مؤشر JSON، الطريقة القياسية لمعالجة قيمة واحدة داخل المستند. المتداخلة {"user":{"name":"Ada","address":{"city":"Austin"}}} تصبح مسطحة {"user.name":"Ada","user.address.city":"Austin"}. لا شيء يتغير في القيم؛ فقط عنونة لهم تفعل ذلك. كل ورقة، مهما كانت عميقة، تحصل على مفتاح واحد يوضح كيفية الوصول إليها.

يتم التعامل مع المصفوفات بنفس الطريقة، حيث يصبح فهرس المصفوفة مقطع مسار {"roles":["admin","editor"]} يتسطح ل {"roles.0":"admin","roles.1":"editor"}. الفهرس الموجود في المفتاح هو ما يسمح للعملية العكسية بإعادة بناء المصفوفة بالترتيب الصحيح. تأخذ هذه العملية العكسية، غير المسطحة، كائنًا مسطحًا من المفاتيح المنقطة وتعيد بناء الكائنات والمصفوفات المتداخلة، وتقرر في كل خطوة ما إذا كان مقطع المسار يسمي خاصية كائن أو فهرس مصفوفة. عندما تستخدم flat وunflatten نفس المحدد وتدوين المصفوفة، فهي معكوسات دقيقة، وهذه الرحلة ذهابًا وإيابًا بدون فقدان هي الخاصية التي تجعل الأداة جديرة بالثقة للعمل الحقيقي بدلاً من الراحة في اتجاه واحد.

لماذا أقوم بتسوية JSON في المقام الأول؟

لأن الكثير من الأنظمة تتحدث فقط عن أزواج القيمة الرئيسية المسطحة، والمسار المنقط هو الطريقة القياسية لنقل البنية المتداخلة من خلالها دون فقدانها. أوضح مثال هو جدول البيانات. جدول البيانات عبارة عن شبكة من الأعمدة، ولا يوجد عمود لـ &quot؛ المدينة داخل العنوان داخل المستخدم.&quot؛ تسطيح الكائن و user.address.city يصبح رأس عمود واحد يمكن أن تعيش القيمة تحته، وهو بالضبط ما تحتاجه تذكرة تصدير الإعدادات الخاصة بي.

ويظهر نفس الشكل في العديد من الأماكن الأخرى. متغيرات البيئة و .env الملفات مسطحة، والأدوات التي تقوم بتعيين التكوين لها تستخدم مسارات منقطة أو بارزة. تقوم مكتبات التدويل بتشغيل سلاسلها بمسارات منقطة مثل checkout.button.label. تريد منصات علم الميزات، ومخططات أحداث التحليلات، والكثير من خطوط أنابيب التسجيل مستوى واحدًا من المفاتيح، غالبًا حتى يتمكنوا من فهرسة كل حقل أو الاستعلام عنه بشكل مستقل. في كل حالة، يكون التداخل حقيقيًا وذو معنى، والتسطيح يحافظ عليه في المسار بدلاً من التخلص منه. عندما يخدم التمثيل المسطح غرضه، يقوم Unflatten بإعادة بناء الكائن الأصلي. إذا كنت تنتقل أيضًا بين JSON وجداول البيانات على وجه التحديد، فإن محول CSV إلى JSON هو الرفيق الطبيعي للجزء الجدولي من تلك الرحلة.

كيف يتم التعامل مع المصفوفات عند التسطيح؟

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

الإدخال تدوين نقطة تدوين قوس
{"roles":["admin","editor"]} roles.0، roles.1 roles[0]، roles[1]
{"items":[{"id":1}]} items.0.id items[0].id
{"matrix":[[1,2]]} matrix.0.0 matrix[0][0]

يكتب تدوين النقطة roles.0وهو مدمج ويطابق عدد أنظمة التكوين وi18n التي تقوم بمفتاح قيمها. يكتب تدوين القوس roles[0]، والذي يعكس بناء جملة الوصول إلى JavaScript ونمط المسار الذي تستخدمه بعض لغات الاستعلام. لا هو الاكثر صحة؛ يمكنك اختيار ما يتوقعه النظام على الطرف الآخر. الشيء المهم هو الاتساق: مهما كانت التدوينة التي تقوم بتسوية بها، استخدم نفس التدوين لإلغاء التسوية، لأن هذه هي الطريقة التي تعرف بها الأداة المقطع الرقمي يعني &quot؛ فهرس المصفوفة واقتباسها؛ بدلاً من &quot؛ مفتاح كائن يصادف أنه رقم.&quot؛ يقوم أداة تسطيح Toolz افتراضيًا بتدوين النقاط ويتيح لك التبديل إلى وضع قوسين بنقرة واحدة.

كيف يمكنني استخدام جهاز التسطيح JSON؟

التدفق له اتجاهين واثنين من الخيارات. ابدأ باختيار flatin أو unflatten مع التبديل في الأعلى. يأخذ Flatten JSON المتداخل وينتج مفاتيح منقطة؛ يأخذ Unflatten المفاتيح المنقطة ويعيد بناء البنية المتداخلة. تملأ عينة التحميل مثالًا عمليًا لأي اتجاه أنت فيه، حتى تتمكن من رؤية شكل كل من الإدخال والإخراج قبل لصق بياناتك الخاصة.

الصق JSON الخاص بك في مربع الإدخال. للتسطيح، هذا كائن متداخل؛ بالنسبة إلى غير المسطح، فهو كائن مسطح مفاتيحه عبارة عن مسارات منقطة. يجب أن يكون الإدخال JSON صالحًا، وإذا لم يكن كذلك، تقوم الأداة بالإبلاغ عن رسالة المحلل اللغوي &#39؛ وموضع المشكلة بدلاً من تسليمك مخرجًا فارغًا، لذلك يتم العثور على فاصلة زائدة ضالة بسرعة. اضبط نمط المفتاح: يتم تعيين المحدد افتراضيًا على نقطة ويمكن تغييره عندما تحتوي مفاتيحك بالفعل على نقاط، ويتم تبديل تدوين المصفوفة بينهما roles.0 و roles[0]. حافظ على تطابق هذين الإعدادين عبر سطح مسطح ومطابقته غير مسطحة حتى تصطف الرحلة ذهابًا وإيابًا. انقر فوق زر الإجراء، وتحقق من عدد المفاتيح الذي يؤكد عدد الأوراق التي تم إنتاجها، وانسخ الإخراج أو قم بتنزيله كـ .json ملف. يتم تشغيل كل شيء لحظة النقر في متصفحك، دون إرسال أي شيء إلى أي مكان.

هل التسطيح بدون فقدان، وما هي حالات الحافة؟

بالنسبة لأداة Toolz، نعم، مع حالة حافة واحدة تستحق المعرفة. العددية، nullالقيم المنطقية والأرقام تبقى على قيد الحياة دون أن تمس. الجزء الدقيق عبارة عن حاويات فارغة: كائن فارغ {} أو مصفوفة فارغة [] يتم الاحتفاظ بها كقيمة ورقية بدلاً من إسقاطها بصمت، لذا فإن التكوين الذي يعتمد على قائمة فارغة لا يزال ذهابًا وإيابًا إلى ما كان عليه بالضبط. يفقد الكثير من أدوات التسطيح الساذجة الحاويات الفارغة، مما يغير معنى المستند بهدوء، لذا فهذا اختيار متعمد.

القيد الحقيقي الوحيد هو المفاتيح التي تحتوي بالفعل على المحدد. إذا كانت بياناتك تحتوي على مفتاح كائن به نقطة حرفية، مثل {"a.b":1}، وإذا قمت بالتسطيح باستخدام محدد نقطة، يصبح المسار غامضًا: لا يستطيع غير المسطح معرفة ما إذا كان a.b كان مفتاحًا واحدًا أو متداخلًا a ثم b. الإصلاح هو تغيير المحدد إلى حرف لا يظهر في مفاتيحك، مثل شرطة مائلة أو أنبوب، واستخدام نفس المحدد لكلا الاتجاهين. إنها نفس فئة مشكلة الهروب التي تراها متى تصطدم محددات CSV بالبياناتوينطبق نفس الحل: اختر فاصلًا لا تحتوي عليه قيمك. خارج هذه الحالة، تقوم عملية التسطيح متبوعة بـ غير المسطحة مع الإعدادات المطابقة بإعادة إنتاج المستند الأصلي تمامًا، بما في ذلك المصفوفات والحاويات الفارغة.

ما الفرق بين التسطيح والتحويل إلى تنسيق آخر؟

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

إذا كنت تريد التعبير عن نفس البيانات بـ YAML لملف التكوين، فإن محول JSON إلى YAML هي الأداة، لأنها تغير بناء الجملة بدلا من الشكل. إذا كنت تريد واجهة TypeScript تصف البنية حتى تعرف الواجهة الأمامية ما يتم التعامل معه، فإن JSON إلى محول TypeScript يستنتج ذلك من عينة. إذا كنت تريد عقدًا رسميًا للتحقق من صحته، فإن مولد مخطط JSON يستمد مخطط JSON من مثال. يقع التسطيح بجانب هذه العناصر بدلاً من استبدالها: يمكنك التسطيح عندما يريد النظام النهائي مستوى واحدًا من المفاتيح، وتقوم بالتحويل عندما يريد النظام لغة مختلفة. كثيرًا ما أقوم بالأمرين معًا بالتسلسل، حيث أقوم بتسوية الحمولة لتحريرها كأعمدة ثم، بشكل منفصل، إنشاء أنواع للإصدار المتداخل الذي أسلمه إلى React. للطباعة الجميلة أو التحقق من صحة JSON في أي نقطة في تلك السلسلة، منسق JSON هي الأداة المساعدة التي أبقيها مفتوحة في علامة التبويب التالية.

كيف يمكن لـ Unflatten الاختيار بين المصفوفة والكائن؟

هذه هي الآلية التي تجعل الرحلة ذهابًا وإيابًا تعمل، وفهمها يفسر كلاً من الإعدادات الافتراضية للأداة &#39؛ وحافتها الحادة الوحيدة. عندما يقرأ غير مسطح مفتاحًا مثل user.roles.0، يقسمها إلى أجزاء user، roles، و 0، ثم يمشي بهم لبناء الهيكل كما هو الحال. في كل خطوة، ينظر إلى الجزء التالي ليقرر نوع الحاوية التي سيتم إنشاؤها. إذا كان الجزء التالي عددًا صحيحًا غير سالب، فإنه يصنع مصفوفة؛ إذا كان أي شيء آخر، فإنه يصنع كائنًا. لذا roles.0 يخبر الأداة بذلك roles يجب أن يكون مصفوفة عنصرها الأول هو القيمة، بينما address.city يقول ذلك address ينبغي أن يكون كائنًا مع city ملكية.

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

هذه هي الحافة الحادة التي تتبع القاعدة: كائن مفاتيحه هي السلاسل حقًا "0"، "1"، "2" لا يمكن تمييزه، بمجرد تسويته، عن المصفوفة. كلاهما ينتج المفاتيح 0، 1، 2، وسوف تقوم Unflatten بإعادة بنائها كمصفوفة لأن هذه هي الحالة الشائعة للغاية. إذا كنت تحتاج حقًا إلى كائن مزود بمفاتيح سلسلة رقمية للبقاء على قيد الحياة ذهابًا وإيابًا، فهذا هو الموقف الوحيد الذي لن يعيد لك فيه التسطيح وعدم التسطيح النوع الدقيق، ومن الأفضل أن تحافظ على هذا الكائن متداخلًا أو تستخدم نظام مفاتيح غير رقمي. في سنوات من القيام بذلك، قمت بضرب هذه الحالة مرتين بالضبط، في المرتين في البيانات التي يمكن القول إنها تم تصميمها بشكل خاطئ في البداية، وبالتالي فإن الإعداد الافتراضي هو التداول الصحيح للجميع تقريبًا. إنه نفس النوع من القرار العملي وراء الاحتفاظ بالأرقام ذات الأصفار البادئة كسلاسل في محول CSV إلى JSON: تعمل الأداة على تحسين ما تعنيه البيانات دائمًا تقريبًا، وتوثق الاستثناء النادر بدلاً من جعل المسار المشترك محرجًا.

هل JSON الخاص بي آمن للصقه في هذه الأداة؟

نعم، وهو معماري وليس وعدًا. يتم تشغيل التحليل والتسطيح وعدم التسطيح والتسلسل كجافا سكريبت داخل علامة تبويب المتصفح الخاصة بك. لا يوجد تحميل، ولا خادم ذهابًا وإيابًا، ولا يتم تسجيل أو تخزين أي شيء. افتح علامة تبويب الشبكة الخاصة بالمتصفح &#39؛ وانقر فوق زر الإجراء: لا يخرج أي طلب. بمجرد تحميل الصفحة، يمكنك قطع الاتصال بالإنترنت وتستمر في العمل، لأنه لم يكن هناك خادم في الحلقة في البداية.

هذا مهم أكثر مما قد يبدو، لأن حمولات JSON هي بالضبط نوع الشيء الذي يحمل الأسرار: رموز API المميزة في التكوين، والبيانات الشخصية في استجابة API، والمعرفات الداخلية في نقطة الإعدادات. من شأن أداة التسطيح التي قامت بتحميل الكائن الخاص بك إلى الخادم أن تحول حمولة خاصة إلى شخص آخر &#39؛s سطر السجل. تعمل المعالجة من جانب العميل على إزالة المخاطر تمامًا، ولهذا السبب فهي الافتراضية عبر كل أداة على Toolz.dev. إذا كنت تريد المنطق الكامل، فقد وضعته في دليل خصوصية البيانات للأدوات عبر الإنترنتوالمجموعة الأوسع التي أستخدمها لهذا النوع من العمل موجودة في منزلي دليل مجموعة أدوات مطور الويب.

الأسئلة المتداولة

ماذا يعني تسطيح JSON؟ يقوم Flattening JSON بتحويل كائن متداخل إلى كائن أحادي المستوى تكون مفاتيحه هي المسار إلى كل قيمة. المتداخلة {"user":{"city":"Austin"}} تصبح مسطحة {"user.city":"Austin"}. تحصل كل قيمة ورقة على مفتاح منقط واحد، ولا يبقى أي تداخل في الإخراج. يعكس Unflatten العملية ويعيد بناء البنية المتداخلة.

كيف يتم التعامل مع المصفوفات عند التسطيح؟ يتم تسطيح عناصر المصفوفة باستخدام فهرسها كقطعة مسار. {"roles":["admin","editor"]} يصبح {"roles.0":"admin","roles.1":"editor"} في تدوين النقطة، أو {"roles[0]":"admin","roles[1]":"editor"} في تدوين قوس. يحافظ الفهرس على الترتيب بحيث يمكن إعادة بناء المصفوفة بالضبط عندما تكون غير مسطح.

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

ما الفرق بين تدوين مصفوفة النقاط والقوس؟ كلاهما يشفران نفس فهرس المصفوفة؛ يختلف بناء الجملة فقط. تدوين نقطة يكتب items.0.id، وهو مدمج وشائع في التكوين ومفاتيح i18n. يكتب تدوين القوس items[0].id، والذي يطابق بناء جملة الوصول إلى JavaScript وبعض لغات الاستعلام. اختر ما يتوقعه النظام المستهدف، واستخدم نفس الشيء في كلا الاتجاهين.

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

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

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

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

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!