دليل المبرمج لبيانات بايثون و JSON

آخر تحديث: 12/29/2025
نبذة عن الكاتب: ج مصدر تريل
  • تتوافق JSON بشكل واضح مع أنواع Python الأساسية، حيث يتم تمثيل الكائنات والمصفوفات كقواميس وقوائم، مما يجعل تبادل البيانات أمرًا بسيطًا.
  • توفر وحدة json في بايثون وظائف تفريغ/تحميل مرنة مع خيارات للطباعة الجميلة، والمشفرات المخصصة، وترتيب المفاتيح الثابت.
  • تعتمد قراءة وكتابة وتحليل JSON المتداخل من الملفات وواجهات برمجة التطبيقات على نفس الأدوات الأساسية، بالإضافة إلى معالجة الأخطاء بعناية.
  • بالإضافة إلى التسلسل الأساسي، يدعم JSON في بايثون التنسيق والتحقق والتكامل مع تنسيقات البيانات الأخرى مثل CSV و XML.

برنامج تعليمي لبيانات JSON باستخدام بايثون

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

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

ما هو JSON وكيف يرتبط ببيانات بايثون

JSON، اختصارًا لـ JavaScript Object Notation، هو تنسيق نصي للبيانات المنظمة، استعار في الأصل بنيته من كائنات ومصفوفات JavaScript. على الرغم من جذوره في JavaScript، فإن JSON مستقل عن لغة البرمجة، وتدعمه جميع اللغات الحديثة تقريبًا، بما في ذلك Python، مما يجعله مثاليًا لتبادل البيانات بين الخدمات والعملاء والخوادم.

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

يبدو الكائن في جافا سكريبت (وجيسون) على النحو التالي: {"key1": value1, "key2": value2}هي عبارة عن مجموعة من أزواج المفاتيح والقيم، حيث تكون المفاتيح عبارة عن سلاسل نصية، ويمكن أن تكون القيم أي قيمة JSON صالحة (بما في ذلك الكائنات أو المصفوفات الأخرى). وهذا يتوافق بشكل كبير مع لغة بايثون. dict.

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

إنّ الربط بين أنواع JSON وأنواع Python بسيط للغاية، ولهذا السبب قد تسمع البعض يطلق عليها مازحًا اسم "PYON" (تدوين كائنات Python). عند قيام Python بتشفير أو فك تشفير JSON، تنطبق العلاقات التالية:

  • كائن JSON → Python dict
  • مصفوفة JSON → Python list
  • سلسلة JSON → Python str
  • رقم JSON (عدد صحيح) → Python int
  • رقم JSON (حقيقي) → Python float
  • JSON true Python True
  • JSON false Python False
  • JSON null Python None

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

رسم خرائط بيانات JSON باستخدام بايثون

وحدة json المدمجة في بايثون

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

الوظائف الأساسية الأربع التي ستستخدمها في معظم الأوقات هي: json.dumps() و json.dump() لتحويل كائنات بايثون إلى JSON، و json.loads() و json.load() لتحويل JSON إلى أنواع بيانات بايثون. تعمل الإصدارات التي تحتوي على "s" مع السلاسل النصية، بينما تعمل الإصدارات التي لا تحتوي على "s" مع الكائنات الشبيهة بالملفات.

استخدم json يدعم برنامج التشفير مجموعة محددة من أنواع بايثون بشكل افتراضي، أي dict, list, tuple (كمصفوفات)، str، أرقام (int, float، وأنواع التعداد المشتقة من الأعداد الصحيحة/العائمة)، والأنواع الفردية الثلاثة الخاصة. True, Falseو None. يتم تحويل هذه إلى ما يعادلها من JSON وفقًا للتخطيط الموضح سابقًا.

إذا كنت بحاجة إلى تسلسل الكائنات أو أنواع البيانات المخصصة، تصميم الوحدة قابل للتوسيع: يمكنك إنشاء فئة فرعية من مُشفِّر JSON وتنفيذها default() طريقة، أو تمرير طريقة مخصصة default الوظيفة في json.dump() / json.dumps()يجب أن تُعيد هذه الدالة المخصصة شيئًا قابلاً للتحويل إلى JSON (مثل dict or listأو رفع TypeError إذا لم يكن يعرف كيفية التعامل مع الكائن المحدد.

كما توفر الوحدة، من الداخل، طرقًا مثل encode() و iterencode(), والتي تقوم بتحويل بيانات بايثون إلى سلاسل JSON، مع iterencode() يتم استخراج الأجزاء المشفرة تدريجيًا. لا يُستخدم هذا الأسلوب بشكل مباشر إلا نادرًا، ولكن من المفيد معرفته إذا كنت بحاجة إلى معالجة استجابات JSON كبيرة جدًا.

تحويل كائنات بايثون إلى JSON

عندما تريد تحويل بيانات بايثون إلى نص JSON، فإنك تستخدم json.dump() or json.dumps(), يعتمد ذلك على ما إذا كنت ترغب في الكتابة مباشرةً إلى ملف أو الحصول على سلسلة JSON في الذاكرة. تشترك كلتا الدالتين في نفس المعلمات الأساسية التي تتيح لك التحكم في كيفية عمل عملية التحويل.

وظيفة json.dump(obj, fp, ...) يأخذ كائن بايثون وكائنًا يشبه الملف، ويكتب تمثيل JSON لـ obj إلى ذلك الملف. نظيره الموجود في الذاكرة، json.dumps(obj, ...)تُعيد هذه الدالة سلسلة JSON بدلاً من الكتابة إلى ملف. تقبل كلتاهما سلسلة من الوسائط المُسماة مثل skipkeys, ensure_ascii, check_circular, allow_nan, indent, separators, defaultو sort_keys.

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

إليكم ما تعنيه المعايير الرئيسية من الناحية العملية:

  • skipkeys: إذا تم ضبطه على Trueمفاتيح القاموس التي ليست من النوع str, int, float, bool or None يتم تخطيها بصمت بدلاً من رفعها TypeErrorإذا كنت تفضل سلوكًا سريعًا عند حدوث أعطال في المفاتيح، فاتركه كما هو. False.
  • ensure_ascii: متى True (الوضع الافتراضي)، يتم وضع علامة هروب على الأحرف غير ASCII والأحرف غير القابلة للطباعة (على سبيل المثال كـ \uXXXXوبالتالي يبقى الناتج نص ASCII نقيًا. عندما False، يتم كتابة أحرف Unicode كما هي، وهو ما يكون عادةً أفضل بالنسبة لملفات التكوين أو السجلات التي يمكن قراءتها من قبل البشر.
  • check_circular: if Trueيتحقق المُشفِّر من وجود مراجع دائرية في القوائم والقواميس والكائنات المُشفَّرة المُخصصة لمنع التكرار اللانهائي. ضبطه على False يؤدي ذلك إلى تعطيل شبكة الأمان هذه، وقد يتسبب في... RecursionError إذا كانت هياكلك ذاتية المرجعية.
  • allow_nan: if Trueقيم الفاصلة العائمة الخاصة مثل NaN, Infinityو -Infinity يُسمح بها ويتم ترميزها بطريقة متوافقة مع جافا سكريبت، على الرغم من أنها لا تُعتبر JSON صالحة تمامًا وفقًا للمواصفات. إذا Falseمحاولة ترميز هذه القيم ستؤدي إلى ظهور خطأ ValueError.
  • indent: عدد صحيح غير سالب (أو سلسلة نصية) يتحكم في تنسيق الطباعة. يشير العدد الموجب إلى عدد المسافات في كل مستوى متداخل. سلسلة نصية (مثل "\t"يُستخدم ) مباشرةً للمسافة البادئة. None (الوضع الافتراضي) يختار التمثيل الأكثر اختصارًا، بدون أسطر جديدة إضافية تتجاوز المطلوب.
  • separators: مجموعة (item_separator, key_separator) التحكم في علامات الترقيم والمسافات البيضاء بين العناصر وبين المفاتيح والقيم. وللحصول على JSON مضغوط للغاية، عادةً ما تستخدم (",", ":") لإزالة جميع المسافات الاختيارية.
  • default: دالة تستقبل أي كائن لا يعرف المُشفِّر كيفية التعامل معه. يجب أن تُعيد بديلاً قابلاً للتحويل إلى JSON (مثل dict or listأو رفع TypeErrorهذا هو العنصر الأساسي لجعل فئاتك قابلة للتسلسل.
  • sort_keys: if Trueيتم ترميز القواميس بمفاتيح مرتبة. وهذا مفيد للغاية لاختبارات الانحدار وللحصول على مخرجات قابلة للتكرار، حيث ترغب في أن تكون ملفات JSON ثابتة عبر عمليات التشغيل.

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

import pathlib
import json

path = pathlib.Path("myTextFile.json")
data =

with path.open(mode="wt") as f:
    json.dump(data, f)

print(json.dumps(data, indent=4))

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

تحليل JSON وتحويله إلى بايثون

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

تبدو التوقيعات تقريبًا على هذا النحو: json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw) و json.loads(s, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, kw)على المستوى الأساسي، يمكنك استدعاءها باستخدام مدخلات JSON فقط، لكن الوسائط الإضافية تفتح الباب أمام سلوك تحليل أكثر تقدماً.

خطافات مثل object_hook و object_pairs_hook يتيح لك تخصيص كيفية تحويل كائنات JSON إلى هياكل بايثون، عن طريق تزويدك إما بفك التشفير dict أو قائمة بـ (key, value) على التوالي. هذا مفيد إذا كنت ترغب في إنشاء فئات مخصصة مباشرة من JSON أو الحفاظ على الترتيب بطريقة معينة.

دوال أخرى قابلة للاستدعاء مثل parse_float, parse_intو parse_constant تتيح لك هذه الميزة التحكم في كيفية تفسير الأرقام والرموز الخاصة. على سبيل المثال، قد ترغب في استخدام Decimal بدلا من float للحصول على قيم نقدية، أو تحويلها "NaN", "inf"و "-inf" إلى أغراض حراسة من اختيارك.

استكمالاً للمثال السابق، يمكنك قراءة ملف JSON الذي كتبته على النحو التالي:

with path.open(mode="rt") as f:
    data = json.load(f)
print(data)

ستكون النتيجة عبارة عن قائمة وقاموس عاديين بلغة بايثون. مثلا والتي يمكنك التعامل معها باستخدام جميع عمليات بايثون المعتادة. من وجهة نظر الكود الخاص بك، فهي "مجرد بيانات" مرة أخرى.

ما هي أنواع البيانات التي يمكن لـ Python تحويلها إلى JSON؟

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

بشكل افتراضي، يمكنك تمرير كائنات بايثون التالية بأمان إلى json.dumps():

  • dict (مُشفّرة ككائنات JSON)
  • list و tuple (مُشفّرة كمصفوفات JSON)
  • str (مُشفّرة كسلاسل JSON)
  • int و float (مُشفّرة كأرقام JSON)
  • True و False (مشفر كـ true و false)
  • None (مشفر كـ null)

عندما يقوم بايثون بتشفير هذه البيانات، يصبح تحويلها إلى JSON أمراً بسيطاً. والعكس صحيح عند فك التشفير. على سبيل المثال، بايثون tuple يتحول إلى مصفوفة JSON، وستحصل على list تمت إعادة التحميل. القيم المُعدّدة مُشتقة من int or float ويمكن أيضًا ترميزها كأرقام.

أما كل شيء آخر فيحتاج إما إلى تصميم خاص default معالج (لتحويل الكائنات إلى تمثيل قابل للتسلسل) أو سيؤدي إلى TypeErrorهذا مقصود: JSON مُصمم للبيانات، وليس لرسوم بيانية عشوائية للكائنات ذات سلوكيات وأساليب كما قد تقوم بتسلسلها باستخدام pickle.

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

طباعة جميلة، وإخراج مضغوط، ومفاتيح مرتبة

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

استخدم indent معلمة json.dumps() هو الرافعة الرئيسية للطباعة الجميلة، يتيح لك هذا الخيار تحديد عدد المسافات (أو نوع السلسلة النصية) التي يجب استخدامها في بايثون لكل مستوى من مستويات المسافة البادئة. ومن الخيارات الشائعة ما يلي: indent=4على الرغم من أن بعض قواعد البيانات البرمجية تفضل استخدام مسافتين أو علامات الجدولة؛ إلا أن الاتفاقيات الأسلوبية تختلف بين المشاريع.

استخدم separators تتيح لك هذه الحجة ضبط المسافات البيضاء بدقة أكبر، إعطاء مجموعة مثل (", ", ": ") يتم ذلك افتراضيًا لعرض مخرجات سهلة الاستخدام. إذا كنت ترغب في الحصول على تمثيل مضغوط قدر الإمكان - على سبيل المثال لتقليل حجم البيانات المرسلة عبر الشبكة - يمكنك ضبط separators=(",", ":") لإزالة المسافات بعد الفواصل والنقطتين الرأسيتين.

عندما تهتم بالنتائج الحتمية، على سبيل المثال في اختبارات الوحدة أو مقارنات اللقطات، تفعيل sort_keys=True يجعل هذا البرنامج المُشفِّر يُخرج مفاتيح القاموس بترتيب مُرتب. وبهذه الطريقة، لا يختلف تشغيلان ينتجان بيانات متطابقة دلاليًا لمجرد اختلاف ترتيب مفاتيح القواميس.

معا، indent, separatorsو sort_keys يمنحك الكثير من التحكم حول ما إذا كان ملف JSON الخاص بك مُحسَّنًا للآلات (مضغوط، بدون مسافات بيضاء) أو للبشر (مُزاح، مُحاذي، ذو شكل ثابت عبر عمليات التشغيل).

البيانات المتداخلة، واستراتيجيات التحليل، وأنماط الوصول

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

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

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

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

بغض النظر عن العمق، فإن الأمر نفسه json.loads() ينطبق السلوك التالي: تقبل الدالة سلسلة JSON وتنتج أنواع بيانات بايثون أصلية يمكنك التعامل معها باستخدام أدوات بايثون العادية. لا توجد حاجة إلى أي صيغة خاصة بخلاف الصيغة العادية. dict و list الفهرسة.

العمل مع ملفات JSON: القراءة والكتابة والإضافة

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

كتابة بيانات JSON إلى ملف هي عادةً عملية من خطوتين: تسلسل بيانات بايثون باستخدام json.dumps() أو مباشرة مع json.dump()ثم تأكد من كتابة السلسلة الناتجة على القرص. إذا قمت باستدعاء open('data.json', 'w')، ستحصل على مؤشر ملف في وضع الكتابة يقوم إما بإنشاء الملف أو اقتطاعه إذا كان موجودًا بالفعل.

بالنسبة للهياكل المتداخلة، لا يختلف البروتوكول عن البيانات المسطحة: ما زلت تستخدم نفس الشيء json.dump() يتم استدعاء الدالة، ويتم ترميز التركيبات المتداخلة للقوائم والقواميس بشكل متكرر. القرار الوحيد الذي عليك اتخاذه عادةً هو مقدار المسافة البادئة التي تريدها لتحسين سهولة القراءة مقابل حجم الملف.

قراءة بيانات JSON من ملف هي عكس ذلك: افتح الملف في وضع النص، مرر كائن الملف إلى json.load()وبذلك تستعيد بنية بيانات بايثون الخاصة بك. ومرة ​​أخرى، فإن السلوك مستقل عن مدى عمق التداخل - إذ يتولى المُفكِّك كل ذلك نيابةً عنك.

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

JSON في العالم الحقيقي: واجهات برمجة التطبيقات والتخزين والتبادل

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

في تفاعل واجهات برمجة التطبيقات، يُعد تنسيق JSON هو الأكثر شيوعًا بين تنسيقات البيانات المرسلة. وخاصة في خدمات RESTful. تستخدم تطبيقات بايثون عادةً مكتبات مثل requests لإرسال طلبات HTTP و استلام استجابات JSONثم قم بتحليل تلك الاستجابات باستخدام json.loads() أو باستخدام طرق مساعدة تغلفها.

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

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

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

التنسيق والتحقق من الصحة والعمليات الإضافية على JSON

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

الطباعة الجميلة مع json.dumps(..., indent=...) هي الخطوة الأولى، يُتيح لك هذا النظام إنشاء تسلسلات هرمية مُرتبة بشكلٍ جيد، مما يُسهّل عليك اكتشاف المشكلات الهيكلية بنظرة سريعة. يُعدّ هذا مفيدًا بشكلٍ خاص أثناء تصحيح الأخطاء أو عند مشاركة الأمثلة في الوثائق.

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

غالباً ما تتلخص عملية التحقق من صحة بيانات JSON في محاولة تحليلها والتقاط الاستثناءات. خاصةً إذا كنت تتحقق فقط من صحة بناء الجملة لسلسلة نصية. لإجراء فحوصات أكثر دقة، يمكنك استخدام مخطط JSON ومكتبات خارجية، ولكن في كثير من الحالات يكون التحقق البسيط كافيًا. try/except حول json.loads() كفى.

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

معالجة الأخطاء عند العمل مع JSON

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

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

على سبيل المثال، قد تؤدي محاولة تحليل سلسلة نصية تالفة إلى ظهور خطأ مثل: Failed to decode JSON: Expecting property name enclosed in double quotes: line 1 column 29 (char 28)هذا النوع من الرسائل لا يخبرك فقط بفشل عملية التحليل، بل يخبرك أيضًا بمكان حدوث الارتباك في المدخلات.

أما فيما يتعلق بعملية التشفير، فقد تواجه مشكلة TypeError عند محاولة تسلسل أنواع غير مدعومة، or ValueError إذا قمت برفض ذلك NaN واللانهايات عبر allow_nan=False لكن بياناتك تحتوي على مثل هذه القيم. كما يمكن أن تؤدي المراجع الدائرية في الحاويات إلى حدوث ذلك. RecursionError إذا قمت بتعطيل عمليات التحقق الدائرية.

أفضل الممارسات هي التعامل مع عمليات JSON على أنها عمليات إدخال/إخراج قابلة للخطأ. خاصةً عند القراءة من مصادر الشبكة أو الملفات الخارجية: افترض دائمًا احتمال حدوث خطأ ما، وتعامل مع الاستثناءات وفقًا لذلك، مع إمكانية إضافة طبقات تحقق لفرض قيود أكثر تحديدًا على بياناتك. التغليف json.loads() أو طرق مساعدة واجهة برمجة التطبيقات في try...except تحمي الكتل بقية التعليمات البرمجية الخاصة بك من حالات الفشل المتتالية وتتيح لك العودة أخطاء JSON سهلة الاستخدام للعملاء عند الاقتضاء.

استخدام JSON مع واجهات برمجة تطبيقات الويب في بايثون

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

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

تصبح معالجة الأخطاء ذات أهمية بالغة عند استخدام مكالمات الشبكة، لأنك قد تواجه ليس فقط بيانات JSON غير صالحة، بل أيضًا حالات انتهاء مهلة الاتصال، أو أخطاء في الاتصال، أو أعطالًا من جانب الخادم تستجيب ببيانات HTML بدلًا من JSON. تغليف json.loads() أو طرق مساعدة واجهة برمجة التطبيقات في try...except تحمي الكتل البرمجية بقية التعليمات البرمجية الخاصة بك من حالات الفشل المتتالية.

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

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

مقالة ذات صلة:
تم الحل: الحصول على بيانات صفحة الويب مثل json python
الوظائف ذات الصلة: