ما هو JSON وكيف تستخدمه؟

نشرت: 2022-08-14
صورة نص "JSON" متراكبة على شاشة الكمبيوتر
ماريا فونوتنا / Shutterstock.com

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

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

أساسيات JSON

تم تصميم JSON في الأصل بواسطة Douglas Crockford كتنسيق عديم الحالة لتوصيل البيانات بين المتصفحات والخوادم. في أوائل العقد الأول من القرن الحادي والعشرين ، بدأت مواقع الويب في جلب بيانات إضافية بشكل غير متزامن من الخادم الخاص بها ، بعد تحميل الصفحة الأولية. كتنسيق مستند إلى النص مشتق من JavaScript ، جعلت JSON من الأسهل جلب البيانات واستهلاكها داخل هذه التطبيقات. تم توحيد المواصفات في النهاية باسم ECMA-404 في عام 2013.

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

مثال JSON أساسي

هذا تمثيل JSON لمنشور مدونة:

 {
    "المعرف": 1001 ،
    "title": "ما هو JSON؟" ،
    "مؤلف": {
        "المعرف": 1 ،
        "الاسم": "جيمس والكر"
    } ،
    "العلامات": ["api" ، "json" ، "البرمجة"] ،
    "تم النشر": خطأ ،
    "تاريخ النشر": فارغ
}

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

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

يمكن تمثيل ستة أنواع من البيانات أصليًا في JSON:

  • السلاسل - تتم كتابة السلاسل بين علامات الاقتباس المزدوجة ؛ قد يتم الهروب من الأحرف باستخدام الخطوط المائلة العكسية.
  • الأرقام - تتم كتابة الأرقام كأرقام بدون علامات اقتباس. يمكنك تضمين مكون كسري للإشارة إلى عدد عشري. تفترض معظم تطبيقات تحليل JSON عددًا صحيحًا عند عدم وجود فاصلة عشرية.
  • القيم المنطقية - يتم دعم القيم الحرفية " true false ".
  • خالية - يمكن استخدام القيمة الحرفية null للدلالة على قيمة فارغة أو محذوفة.
  • المصفوفات - المصفوفة عبارة عن قائمة بسيطة يُشار إليها بأقواس مربعة. يتم فصل كل عنصر في القائمة بفاصلة. يمكن أن تحتوي المصفوفات على أي عدد من العناصر ويمكنها استخدام جميع أنواع البيانات المدعومة.
  • الكائنات - يتم إنشاء الكائنات بواسطة أقواس متعرجة. إنها مجموعة من أزواج المفاتيح ذات القيمة حيث تكون المفاتيح عبارة عن سلاسل ملفوفة بعلامات اقتباس مزدوجة. يحتوي كل مفتاح على قيمة يمكن أن تأخذ أيًا من أنواع البيانات المتاحة. يمكنك إجراء تداخل للكائنات لإنشاء تسلسلات هرمية متتالية. يجب أن تتبع الفاصلة كل قيمة ، لتدل على نهاية زوج المفتاح والقيمة.

يقوم محللو JSON تلقائيًا بتحويل أنواع البيانات هذه إلى هياكل مناسبة للغتهم. لا تحتاج إلى تحويل id يدويًا إلى عدد صحيح ، على سبيل المثال. يعد تحليل سلسلة JSON بالكامل كافيًا لإعادة تعيين القيم إلى تنسيق البيانات الأصلي.

علم الدلالة والتحقق من الصحة

لدى JSON قواعد معينة يجب احترامها عند تشفير بياناتك. السلاسل التي لا تلتزم بالصيغة لن تكون قابلة للتحليل من قبل المستهلكين.

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

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

تعيين محتوى JSON

عادةً ما يتم استخدام الامتداد .json عند حفظ JSON في ملف. يحتوي محتوى JSON على application/json من نوع MIME القياسي ، على الرغم من استخدام text/json أحيانًا لأسباب تتعلق بالتوافق. في الوقت الحاضر ، يجب أن تعتمد على application/json أجل Accept رؤوس HTTP و Content-Type .

تقوم معظم واجهات برمجة التطبيقات التي تستخدم JSON بتغليف كل شيء في كائن المستوى الأعلى:

 {
    "خطأ": 1000
}

هذا ليس مطلوبًا - النوع الحرفي صالح كعقدة المستوى الأعلى في ملف ، لذا فإن الأمثلة التالية كلها JSON صالحة أيضًا:

 1000 
 حقيقي 
 لا شيء

سيقومون بفك الشفرة إلى المقاييس الخاصة بهم في لغة البرمجة الخاصة بك.

العمل مع JSON

تحتوي معظم لغات البرمجة على دعم JSON مدمج. إليك كيفية التفاعل مع بيانات JSON في عدد قليل من البيئات الشائعة.

جافا سكريبت

في JavaScript ، تُستخدم أساليب JSON.stringify() و JSON.parse ( JSON.parse() لترميز وفك تشفير سلاسل JSON:

 مشاركة const = {
    المعرف : 1001 ،
    العنوان : "ما هو JSON؟" و
    المؤلف : {
        المعرف : 1 ،
        الاسم : "جيمس ووكر"
    }
} ؛

encodedJson = JSON. تشديد ( آخر ) ؛

// {"id": 1001، "title": "What Is JSON؟"، ...}
وحدة التحكم. سجل ( encodedJson ) ؛

فك رموز constJson = JSON. تحليل ( مشفر Json ) ؛

// جيمس ووكر
وحدة التحكم. سجل ( فك الشفرة. اسم المؤلف ) ؛

بي أتش بي

الدوال المكافئة في PHP هي json_encode() و json_decode() :

 مشاركة $ = [
    "id" => 1001 ،
    "title" => "ما المقصود بـ JSON؟" و
    "المؤلف" => [
        "معرف" => 1 ،
        "الاسم" => "جيمس والكر"
    ]
] ؛

$ encodedJson = json_encode ( $ post ) ؛

// {"id": 1001، "title": "What Is JSON؟"، ...}
صدى $ encodedJson ؛

$ decodedJson = json_decode ( $ encodedJson ، true ) ؛

// جيمس ووكر
echo $ decodedJson [ "المؤلف" ] [ "الاسم" ] ؛

بايثون

توفر Python json.dumps() و json.loads() لإجراء تسلسل وإلغاء التسلسل على التوالي:

 استيراد json

مشاركة = {
    "المعرف" : 1001 ،
    "title" : "ما هو JSON؟" و
    "المؤلف" : {
        "المعرف" : 1 ،
        "الاسم" : "جيمس والكر"
    }
}

encodedJson = json. مقالب ( مشاركة )

# {"id": 1001، "title": "ما هو JSON؟"، ...}
طباعة ( ترميز Json )

decodedJson = json. الأحمال ( المشفرة Json )

# جيمس ووكر
print ( decodedJson [ "author" ] [ "name" ] )

روبي

تقدم Ruby JSON.generate و JSON.parse :

 تتطلب "json"

مشاركة = {
    "id" => 1001 ،
    "title" => "ما المقصود بـ JSON؟" و
    "المؤلف" => {
        "معرف" => 1 ،
        "الاسم" => "جيمس والكر"
    }
}

encodedJson = JSON. توليد ( نشر )

# {"id": 1001، "title": "ما هو JSON؟"، ...}
يضع المشفر Json

فك الشفرة Json = JSON. تحليل ( مشفر Json )

# جيمس ووكر
يضع decodedJson [ "المؤلف" ] [ "الاسم" ]

قيود JSON

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

لا تعليق

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

لا توجد مخططات

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

لا مراجع

لا يمكن للحقول أن تشير إلى قيم أخرى في بنية البيانات. يؤدي هذا غالبًا إلى التكرار الذي يؤدي إلى زيادة حجم الملف. بالعودة إلى مثال منشور المدونة السابق ، يمكن أن يكون لديك قائمة بمشاركات المدونة على النحو التالي:

 {
    "المشاركات": [
        {
            "المعرف": 1001 ،
            "title": "ما هو JSON؟" ،
            "مؤلف": {
                "المعرف": 1 ،
                "الاسم": "جيمس والكر"
            }
        } ،
        {
            "المعرف": 1002 ،
            "title": "ما هي SaaS؟" ،
            "مؤلف": {
                "المعرف": 1 ،
                "الاسم": "جيمس والكر"
            }
        }
    ]
}

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

 {
    "المشاركات": [
        {
            "المعرف": 1001 ،
            "title": "ما هو JSON؟" ،
            "المؤلف": "{{.authors.james}}"
        } ،
        {
            "المعرف": 1002 ،
            "title": "ما هي SaaS؟" ،
            "المؤلف": "{{.authors.james}}"
        }
    ] ،
    "المؤلفون": {
        "جوامع": {
            "المعرف": 1 ،
            "الاسم": "جيمس والكر"
        }
    }
}

هذا غير ممكن حاليًا مع JSON القياسي.

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

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

هذا يسبب تناقضات مزعجة وحالات متطرفة. إذا كان التطبيق الخاص بك يتعامل مع الطوابع الزمنية كسلاسل ، مثل 2022-07-01T12:00:00+00:00 ، لكن واجهة برمجة تطبيقات خارجية تقدم الوقت بالثواني بعد حقبة Unix - 1657287000 - فستحتاج إلى تذكر وقت استخدام كل من التنسيقات.

بدائل JSON

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

شهد YAML اعتمادًا واسعًا لملفات التكوين وداخل أدوات DevOps و IaC وأدوات المراقبة. لا يتم استخدامه بشكل متكرر كتنسيق تبادل البيانات لواجهات برمجة التطبيقات. التعقيد النسبي لـ YAML يعني أنه أقل قابلية للقادمين الجدد. يمكن أن تسبب أخطاء بناء الجملة الصغيرة فشل تحليل مربك.

مخازن البروتوكول (protobufs) هي منافس ناشئ آخر لـ JSON مصمم لتسلسل البيانات المهيكلة. تحتوي Protobufs على إعلانات نوع البيانات والحقول المطلوبة ودعم معظم لغات البرمجة الرئيسية. النظام يكتسب شعبية كطريقة أكثر كفاءة لنقل البيانات عبر الشبكات.

ملخص

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

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