تسطيح JSON المتداخل إلى جدول بمفاتيح ذات ترميز نقطي
حوّل كائن JSON متداخلاً أو مصفوفة متداخلة إلى تسلسل بسيط من صفوف المفاتيح والقيم من دون كتابة برنامج مخصص لاجتياز البنية.
شغّل الأداة مجانًا
يحصل كل حقل متداخل على مسار بترميز نقطي، وتصبح مواضع المصفوفة مقاطع رقمية، ولذلك يمكن الإشارة إلى معرّف الطلب دائماً بصيغة orders.0.id. تناسب النتيجة جداول البيانات وجداول التهيئة في قواعد البيانات والسجلات وأدوات الربط وكل سير عمل يحتاج إلى مسارات متوقعة بدلاً من البنى المتداخلة. المعالجة حتمية وتحافظ على أنواع قيم JSON، كما ترفض JSON غير الصالح أو الجذر القياسي برسالة إدخال واضحة.
حوّل البنية المتداخلة إلى مسارات متوقعة
يناسب JSON المتداخل واجهات API لأنه يجمع القيم المترابطة، لكن كثيراً من أدوات التقارير والاستيراد يتطلب تسلسلاً مسطحاً من الحقول. تجتاز هذه الإمكانية كل خاصية في الكائن وكل عنصر في المصفوفة، ثم تصل المقاطع بنقطة. تصبح القيمة المخزنة داخل الكائن customer ثم الخاصية name بالصيغة customer.name. ويُشار إلى أول عنصر في المصفوفة orders بالصيغة orders.0، ولذلك يصبح معرّفه orders.0.id. تُعاد كل ورقة في البنية على هيئة صف يحتوي على مفتاح وقيمة، مما يسهّل عرض الناتج أو ترشيحه أو تحويله إلى أعمدة. يتبع الاجتياز الترتيب الموجود في JSON بعد تحليله، وبذلك يعطي نتائج مستقرة للمدخل نفسه. تبقى السلاسل سلاسل، والأرقام أرقاماً، والقيم المنطقية من نوعها، كما تبقى null محفوظة. وتُخرج الكائنات والمصفوفات الفارغة كقيم بدلاً من اختفائها بصمت، لذلك يظل الناتج المسطح موثقاً لوجود تلك المسارات في المستند الأصلي.
حضّر الإدخال وافهم الناتج
قدّم مستند JSON كاملاً كنص في الحقل json. يجب أن يكون الجذر كائناً أو مصفوفة. يمنع هذا الشرط إنشاء مفتاح فارغ ملتبس لسلسلة مستقلة أو رقم أو قيمة منطقية أو null. تُستخدم أسماء خصائص الكائن تماماً كما وردت، بينما تُكتب فهارس المصفوفة كمقاطع رقمية تبدأ من 0. تحتوي الاستجابة على pairs، وهي مصفوفة تحمل عناصرها الحقلين key وvalue، ولذلك يمكن التعامل معها مباشرة كصفوف جدول. إذا كان الجذر نفسه كائناً فارغاً أو مصفوفة فارغة، يكون المفتاح المعاد سلسلة فارغة وتحافظ القيمة على ذلك الحاوي الفارغ. لاحظ أن النقاط الموجودة أصلاً في اسم الخاصية لا تخضع للتهريب. فمثلاً، تنتج الخاصية الحرفية user.name المسار الظاهر نفسه الذي ينتجه كائن user متداخل يحتوي على name. إذا كانت بياناتك تستخدم أسماء خصائص منقطة وكان لا بد من استعادة هوية المسار بلا التباس، فأعد تسمية تلك الخصائص قبل التسطيح أو احتفظ بملف JSON الأصلي إلى جانب النتيجة المسطحة.
استخدم الأزواج المسطحة في مسارات عمل البيانات
تصلح الأزواج المسطحة تمثيلاً وسيطاً عملياً. يمكن لأتمتة جدول بيانات أن تضع المفاتيح في عمود والقيم في عمود آخر، ويمكن لمهمة إدخال أن تحوّل المسارات المختارة إلى أعمدة في صف عريض، كما يمكن لأداة مقارنة أن تفهرس الأزواج حسب المفتاح قبل فحص مستندين. تجعل المقاطع الرقمية للمصفوفة السجلات المتكررة صريحة أيضاً بدلاً من خلط قيم عناصر مختلفة. ولأن العملية لا ترسل طلبات شبكية ولا تستخدم قيماً عشوائية أو طوابع زمنية أو استدلال نماذج، فإن نص JSON المتطابق ينتج المخرجات نفسها دائماً. يفشل JSON غير الصالح من دون إعادة نتيجة جزئية، ويفشل JSON القياسي الصالح أيضاً لأنه لا يطابق شرط الكائن أو المصفوفة. سعر API هو $0.002 لكل عنصر، بينما يستطيع مشغّل المتصفح تنفيذ المنطق الحتمي نفسه محلياً. بالنسبة إلى المستندات الضخمة جداً، فكّر في مسار معالجة متدفق أو مخصص للمخطط، لأن التسطيح ينشئ صفاً لكل ورقة أولية أو حاوية فارغة في المستند بأكمله.
حالات الاستخدام
جهّز استجابة API لعرضها في جدول
حوّل حقول الاستجابة المتداخلة إلى مسارات صريحة يمكنك اختيارها أو ربطها أو عرضها كصفوف من المفاتيح والقيم.
أنشئ مخططات ربط للاستيراد
افحص المسارات ذات الترميز النقطي قبل ربط قيم JSON المختارة بأعمدة جدول بيانات أو قاعدة بيانات.
قارن السجلات المهيكلة
سطّح كائنين إلى تسلسلين مستقرين من المسارات والقيم لتحديد الفروق بواسطة مساراتها الكاملة.
الأسئلة الشائعة
ما تكلفة الاستخدام؟
تبلغ تكلفة كل عنصر عبر API مقدار $0.002. ويمكن لمشغّل المتصفح معالجة الإدخال محلياً مجاناً.
كيف تُمثّل المصفوفات؟
تصبح المواضع مقاطع رقمية تبدأ من 0، مثل orders.0.id وorders.1.id.
هل تُحفظ أنواع قيم JSON؟
نعم. تحتفظ السلاسل والأرقام والقيم المنطقية وnull والحاويات الفارغة بأنواع JSON في الحقل value.
ماذا يحدث للكائنات والمصفوفات الفارغة؟
تُعاد كقيم ورقية كيلا تضيع مساراتها. وتستخدم الحاوية الجذرية الفارغة مفتاحاً فارغاً.
هل يمكن إرسال سلسلة JSON أو رقم كجذر؟
لا. يجب أن يكون الجذر بعد التحليل كائناً أو مصفوفة، وتعيد الجذور القياسية خطأ إدخال غير صالح.
هل تُهرّب النقاط في أسماء الخصائص الأصلية؟
لا. تُحفظ الأسماء كما هي؛ فأعد تسمية الخصائص المنقطة أولاً إذا احتجت إلى مسارات قابلة للعكس بلا التباس.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/data/flatten-nested-json \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"json":"{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"}'const res = await fetch("https://api.kit.forhosting.com/data/flatten-nested-json", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"json": "{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/flatten-nested-json",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"json": "{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/flatten-nested-json", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"json":"{\\"customer\\":{\\"name\\":\\"Ada\\",\\"address\\":{\\"city\\":\\"London\\"}},\\"orders\\":[{\\"id\\":7,\\"paid\\":true}]}"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"json":"{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/flatten-nested-json", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"json": "{\"customer\":{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}},\"orders\":[{\"id\":7,\"paid\":true}]}"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.flatten_nested_json",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_mb | 25 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |