JSONTech

ما هو JSON؟ دليل كامل للمبتدئين

كل ما تحتاج معرفته عن JSON — صيغة البيانات التي تشغّل الويب الحديث — من الصياغة إلى الاستخدام في الواجهات البرمجية.

فريق JSONTech15 يناير 20258 دقائق

JSON في 30 ثانية

JSON (تنسيق كائن جافا سكريبت) هو تنسيق بيانات خفيف الوزن يعتمد على النص، وقد أصبح اللغة المشتركة لتبادل البيانات على الويب. إذا كنت قد اتصلت يومًا بواجهة برمجة تطبيقات REST، أو فتحت ملف package.json، أو عملت مع MongoDB، فقد استخدمت JSON بالفعل — ربما دون التفكير في الأمر كثيرًا.

في جوهره، JSON هو مجرد وسيلة لتمثيل البيانات المنظمة كنص عادي. إنه قابل للقراءة البشرية (إلى حد كبير)، وقابل للتحليل الآلي (بسهولة كبيرة)، ومدعوم من قبل virtually كل لغة برمجة موجودة. هذا المزيج هو بالضبط السبب في فوزه.

تاريخ موجز

تمت شعبية JSON بواسطة دوغلاس كروكفورد في أوائل العقد الأول من القرن الحادي والعشرين. لم "يخترعه" حقًا — التركيب النحوي هو مجموعة فرعية من جافا سكريبت التي كانت موجودة منذ عام 1999 — لكنه أعطاه اسمًا، وموقعًا إلكترونيًا (json.org)، ومواصفة. أحيانًا ما تكون العلامة التجارية أكثر أهمية من الاختراع.

تم تحديد التنسيق رسميًا في RFC 4627 (2006) وتم استبداله لاحقًا بـ RFC 8259 (2017) ومعيار ECMA-404. لكن بصراحة، لم تتغير المواصفة كثيرًا منذ البداية. بساطة JSON هي أعظم قوته — فلا يوجد الكثير لتغييره.

قبل أن يتولى JSON، كانت XML هي تنسيق تبادل البيانات السائد. إذا كنت تريد أن ترى لماذا تجمع المطورون حول JSON، تحقق من مقارنة JSON و XML.

6 أنواع بيانات JSON

يدعم JSON بالضبط ستة أنواع من البيانات. لا أكثر، ولا أقل. هذا القيد مقصود — فهو يبقي الأمور بسيطة وقابلة للتشغيل المتبادل عبر اللغات.

النوعالوصفالمثال
سلسلة نصيةنص محاط بعلامات اقتباس مزدوجة"hello world"
رقمعدد صحيح أو عدد عشري (لا هكس، لا NaN، لا لانهائي)42, 3.14, -7
منطقيالقيمة الحرفية true أو falsetrue
فارغيمثل قيمة فارغة أو غير معروفةnull
كائنمجموعة غير مرتبة من أزواج المفتاح والقيمة{"name": "Ada"}
مصفوفةقائمة مرتبة من القيم[1, 2, 3]

لاحظ ما هو غير موجود في القائمة: التواريخ، الدوال، غير معرف، التعليقات، أو البيانات الثنائية. لا يدعم JSON أيًا من تلك بشكل أصلي. عادةً ما يتم تمرير التواريخ كسلاسل ISO 8601 ("2025-01-15T10:30:00Z")، ويتم ترميز البيانات الثنائية باستخدام Base64. إنه أمر مزعج بعض الشيء، لكنه يحافظ على تنسيق عالمي.

قواعد بناء جملة JSON

بناء جملة JSON صارم. إذا كنت قادمًا من جافا سكريبت، قد تتعثر في بعض هذه القواعد. إليك إياها، بدون تزيين:

  • يجب أن تكون المفاتيح سلاسل نصية محاطة بعلامات اقتباس مزدوجة. علامات الاقتباس المفردة لا تعمل. المفاتيح غير المحاطة بعلامات اقتباس لا تعمل. هذا ليس جافا سكريبت.
  • يجب أن تستخدم السلاسل علامات الاقتباس المزدوجة. 'hello' هو JSON غير صالح. "hello" هو صالح.
  • لا توجد فاصلة زائدة. تلك الفاصلة الأخيرة بعد الخاصية النهائية؟ يقول JSON لا.
  • لا توجد تعليقات. هذه ربما تكون أكثر قرارات تصميم JSON جدلًا. أزالها دوغلاس كروكفورد عمدًا لمنع الإساءة.
  • لا يوجد جذر ذو قيمة واحدة (في المواصفات القديمة). RFC 8259 يسمح الآن بأي قيمة JSON كجذر، لكن العديد من المحللات لا تزال تتوقع كائنًا أو مصفوفة.

إليك مستند JSON صالح:

{
  "name": "Grace Hopper",
  "age": 85,
  "languages": ["COBOL", "FORTRAN"],
  "retired": true,
  "spouse": null,
  "address": {
    "city": "Arlington",
    "state": "VA"
  }
}

وهنا ما يكسره:

{
  name: "Grace Hopper",     // ❌ مفتاح غير محاط بعلامات اقتباس
  'age': 85,                // ❌ مفتاح محاط بعلامات اقتباس مفردة
  "languages": ["COBOL",],  // ❌ فاصلة زائدة
  // هذه تعليق          // ❌ التعليقات غير مسموح بها
}

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

JSON مقابل كائنات جافا سكريبت

هذا يربك تقريبًا كل مطور جافا سكريبت في مرحلة ما. يبدو JSON مثل كائن جافا سكريبت، لكنه ليس نفس الشيء. إليك المكان الذي يختلفان فيه:

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

في الممارسة العملية، تقوم بالتحويل بينهما باستخدام JSON.parse() و JSON.stringify():

// سلسلة → كائن
const data = JSON.parse('{"name": "Ada", "year": 1843}');
console.log(data.name); // "Ada"

// كائن → سلسلة
const json = JSON.stringify({ name: "Ada", year: 1843 });
console.log(json); // '{"name":"Ada","year":1843}'

// طباعة جميلة مع تباعد بمقدار 2
const pretty = JSON.stringify(data, null, 2);

حالات الاستخدام الشائعة

1. واجهات برمجة التطبيقات REST

هذا هو جوهر JSON. الغالبية العظمى من واجهات برمجة التطبيقات الحديثة على الويب ترسل وتستقبل JSON. عندما تقوم بـ fetch() البيانات من خادم، فمن المؤكد تقريبًا أنك تحصل على JSON في المقابل:

const response = await fetch("https://api.example.com/users/1");
const user = await response.json();
// { "id": 1, "name": "Alice", "email": "alice@example.com" }

2. ملفات التكوين

package.json، tsconfig.json، .eslintrc.json، composer.json — القائمة تطول. JSON موجود في كل مكان في أدوات المطورين. عدم وجود تعليقات مؤلم حقًا هنا، ولهذا السبب تدعم بعض الأدوات JSON5 أو JSONC (JSON مع تعليقات) كبدائل.

3. قواعد البيانات NoSQL

تخزن MongoDB الوثائق كـ BSON (JSON ثنائي). تستخدم CouchDB JSON عادي. تستخدم DynamoDB وFirestore والعديد من الآخرين هياكل شبيهة بـ JSON. إذا كنت تعمل مع قاعدة بيانات وثائق، فأنت تعمل مع JSON.

4. التخزين المحلي وإدارة الحالة

يخزن localStorage في المتصفح سلاسل فقط، لذا فإن تسلسل الحالة إلى JSON هو النهج القياسي:

// حفظ
localStorage.setItem("prefs", JSON.stringify({ theme: "dark", lang: "en" }));

// تحميل
const prefs = JSON.parse(localStorage.getItem("prefs") ?? "{}");

5. تبادل البيانات بين الخدمات الصغيرة

تميل قوائم الرسائل (RabbitMQ، Kafka)، والويب هوكس، والتواصل بين الخدمات إلى الاعتماد بشكل كبير على JSON. ليس دائمًا الخيار الأكثر كفاءة في السيناريوهات ذات الإنتاجية العالية (Protobuf وMessagePack أسرع)، لكنه الأكثر قابلية للتصحيح.

أفضل الممارسات لـ JSON

بعد سنوات من العمل مع JSON يوميًا، إليك العادات التي أوصي ببنائها:

  1. استخدم تسميات متسقة. اختر camelCase أو snake_case للمفاتيح والتزم بها عبر واجهة برمجة التطبيقات الخاصة بك. خلطها هو طريق سريع للأخطاء.
  2. تحقق مبكرًا. لا تثق في JSON الوارد بشكل أعمى. استخدم تحقق من مخطط JSON للقبض على البيانات غير الصحيحة قبل أن تصل إلى منطق العمل الخاص بك.
  3. احتفظ بالتعشيش ضحلًا. إذا كان JSON الخاص بك أكثر من 3-4 مستويات عميقة، فكر في تسطيحه. الهياكل المتداخلة بعمق صعبة الاستعلام، وصعبة القراءة، وصعبة المقارنة.
  4. استخدم المصفوفات للقوائم، والكائنات للسجلات. يبدو ذلك واضحًا، لكنني رأيت أشخاصًا يستخدمون كائنات بمفاتيح نصية رقمية ({"0": "a", "1": "b"}) بدلاً من المصفوفات. لا تفعل ذلك.
  5. فضل null على المفاتيح المفقودة عندما لا تحتوي حقل على قيمة. يجعل المخطط واضحًا ويتجنب الغموض حول ما إذا كان الحقل قد تم حذفه عمدًا.
  6. قم بالتنسيق للبشر أثناء التطوير. JSON المضغوط يوفر بايتات ولكنه يقتل قابلية القراءة. استخدم الطباعة الجميلة عند تصحيح الأخطاء، واضغط عند الشحن. يتعامل مضغوط JSON لدينا مع الأخير.

جرب بنفسك: ألصق أي JSON في منسق JSON لدينا للتحقق من صحة، وتنسيق، واستكشاف هيكله مع تمييز بناء الجملة وعرض الشجرة.

ماذا عن JSON5 و JSONC؟

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

  • JSON5 يسمح بالسلاسل النصية المحاطة بعلامات اقتباس مفردة، والفواصل الزائدة، والتعليقات، والمفاتيح غير المحاطة بعلامات اقتباس، وأكثر. إنه رائع لملفات التكوين حيث يكون البشر هم الجمهور الأساسي.
  • JSONC (JSON مع تعليقات) هو ملحق بسيط يستخدمه VS Code وملفات تكوين TypeScript. يضيف فقط دعم التعليقات — لا شيء آخر.

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

الخاتمة

نجح JSON ليس لأنه مثالي، ولكن لأنه جيد بما يكفي تقريبًا لكل شيء وسهل العمل معه. نظامه المحدود من الأنواع محبط في بعض الأحيان (أين توارخي؟)، وقاعدة عدم وجود تعليقات هي نقطة ألم حقيقية. لكن تلك القيود هي أيضًا ما يجعلها قابلة للتشغيل المتبادل عالميًا.

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

استمر في الاستكشاف:

أدوات ذات صلة