┐─ تحليل الملف ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── ┌
│ المطور : غير محدد (معيار مجتمعي)
│ الفئة : بيانات
│ نوع MIME : application/x-ndjson
┘ ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── └
ما هو ملف NDJSON؟
NDJSON (Newline Delimited JSON — JSON محدد بالسطر الجديد) يُعرف أيضاً بـ JSON Lines (.jsonl) أو LDJSON. الفكرة بسيطة: بدل تغليف كل البيانات في مصفوفة JSON كبيرة، يحتوي كل سطر على كائن JSON مستقل وصالح. الفاصل بين السجلات هو مجرد سطر جديد (\n).
هذه البنية البسيطة تحل مشكلة حقيقية في معالجة البيانات الضخمة: ملف JSON كبير يجب تحميله كاملاً في الذاكرة قبل تحليله (Parsing)، بينما NDJSON يمكن قراءته سطراً بسطر — مما يتيح معالجة ملفات بحجم أكبر من الذاكرة المتاحة. هذا ما جعله الصيغة المفضلة في البث (Streaming) وسجلات التطبيقات وخطوط أنابيب البيانات.
كيفية فتح ملفات NDJSON
- أي محرر نصوص — كل سطر قابل للقراءة كـ JSON مستقل
- jq (سطر أوامر، لينكس/ماك/ويندوز) — أداة JSON الأشهر لمعالجة NDJSON
- Python —
for line in open('file.ndjson'): json.loads(line)بكفاءة عالية - DuckDB —
SELECT * FROM 'file.ndjson'مباشرة بدون استيراد - Kibana (ELK Stack) — قراءة سجلات NDJSON من Elasticsearch
- VS Code مع إضافة JSON Formatter — عرض ملفات NDJSON بتنسيق
المواصفات التقنية
| الخاصية | القيمة |
|---|---|
| نوع MIME | application/x-ndjson أو application/jsonl |
| صيغة كل سطر | قيمة JSON صالحة (عادةً كائن {}) |
| الفاصل | سطر جديد \n أو \r\n |
| الترميز | UTF-8 مطلوب |
| يُعرف أيضاً بـ | JSON Lines (.jsonl)، LDJSON، Streaming JSON |
| الأسطر الفارغة | مسموح بها وتُتجاهل |
الاستخدامات الشائعة
- سجلات التطبيقات (Application Logs): مجموعة ELK Stack (Elasticsearch + Logstash + Kibana) تعتمد NDJSON كصيغة سجلات منظمة
- بث البيانات (Streaming): Apache Kafka وAWS Kinesis يُوزّعان رسائل JSON بهذا الشكل عبر خطوط الأنابيب
- فهرسة Elasticsearch بالجملة: واجهة Bulk API تتطلب NDJSON حصراً (سطر عملية + سطر بيانات)
- تصدير قواعد البيانات: MongoDB وFirebase تُصدّران المجموعات بصيغة NDJSON للنسخ الاحتياطي والترحيل
- ML/AI Dataset: مجموعات بيانات التدريب الكبيرة (Common Crawl، OpenAI datasets) بـ NDJSON
أمثلة بيانات NDJSON
{"id": 1, "name": "أحمد", "role": "admin", "active": true}
{"id": 2, "name": "سارة", "role": "editor", "active": true}
{"id": 3, "name": "خالد", "role": "viewer", "active": false}
معالجة NDJSON بـ jq و Python
# عرض كل سجل بصيغة منسقة
jq . users.ndjson
# استخراج حقل واحد فقط
jq '.name' users.ndjson
# فلترة بشرط
jq 'select(.active == true)' users.ndjson
# تحويل NDJSON إلى مصفوفة JSON عادية
jq -s '.' users.ndjson > users_array.json
# تحويل CSV إلى NDJSON باستخدام jq
jq -Rn '[inputs | split(",") | {id: .[0], name: .[1]}][]' data.csv
import json
# قراءة NDJSON سطراً بسطر (كفاءة عالية)
with open('data.ndjson', 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line: # تجاهل الأسطر الفارغة
record = json.loads(line)
print(record['name'])
# كتابة NDJSON
records = [
{"id": 1, "event": "login", "user": "ahmed"},
{"id": 2, "event": "logout", "user": "sara"},
]
with open('events.ndjson', 'w', encoding='utf-8') as f:
for record in records:
f.write(json.dumps(record, ensure_ascii=False) + '\n')
NDJSON مقابل JSON مقابل CSV
| الميزة | NDJSON | JSON | CSV |
|---|---|---|---|
| معالجة سطر بسطر | ✅ | ❌ | ✅ |
| بيانات متداخلة | ✅ | ✅ | ❌ |
| قابلية القراءة | جيدة | ✅ | ✅ |
| حجم الملف | متوسط | متوسط | ✅ أصغر |
| البث (Streaming) | ✅ مثالي | ❌ | ✅ |