التعامل مع صيغة JSON: معالجة البيانات القادمة من واجهات برمجة التطبيقات


التعامل مع صيغة JSON: معالجة البيانات القادمة من واجهات برمجة التطبيقات

ماذا سنتعلم اليوم؟ سنتعمق في كيفية استقبال وتحليل بيانات JSON القادمة من واجهات برمجة التطبيقات (APIs) باستخدام بايثون، وكيفية استخراج المعلومات الهامة منها ومعالجتها بفعالية.

الخطوة 1: فهم JSON واستقبال البيانات

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

ملاحظة تقنية: JSON (JavaScript Object Notation) هو صيغة خفيفة الوزن لتبادل البيانات، وهو مستقل عن اللغة. يُستخدم بشكل واسع في واجهات برمجة التطبيقات لنقل البيانات المنظمة.

لنبدأ بمحاكاة استجابة API تحتوي على بيانات JSON:

import json

# محاكاة لبيانات JSON قادمة من واجهة برمجة تطبيقات (API) كنص
# هذه البيانات تمثل قائمة بمشاريع، كل مشروع له معرف، اسم، حالة، ومجموعة من المهام
api_response_json_string = """
[
    {
        "id": "proj-001",
        "name": "تطوير تطبيق ويب جديد",
        "status": "قيد التقدم",
        "tasks": [
            {"task_id": 1, "description": "تحديد المتطلبات", "completed": true},
            {"task_id": 2, "description": "تصميم قاعدة البيانات", "completed": false},
            {"task_id": 3, "description": "تطوير الواجهة الأمامية", "completed": false}
        ]
    },
    {
        "id": "proj-002",
        "name": "تحسين أداء الخادم",
        "status": "مكتمل",
        "tasks": [
            {"task_id": 1, "description": "تحليل سجلات الأداء", "completed": true},
            {"task_id": 2, "description": "تحسين استعلامات قاعدة البيانات", "completed": true}
        ]
    }
]
"""

# استخدام json.loads() لتحويل النص JSON إلى كائن بايثون (قائمة في هذه الحالة)
# json.loads() تعني "load string"
data = json.loads(api_response_json_string)

# طباعة نوع البيانات للتحقق
print(f"نوع البيانات بعد التحويل: {type(data)}")
# طباعة البيانات المحولة
print("البيانات المحولة (أول مشروع):")
print(data[0])

الخطوة 2: الوصول إلى البيانات

بعد تحويل نص JSON إلى كائنات بايثون (قوائم وقواميس)، يمكننا الآن الوصول إلى العناصر الفردية باستخدام مفاتيح القواميس وفهارس القوائم تماماً كما نفعل مع أي بنية بيانات بايثون أخرى.

# الوصول إلى اسم المشروع الأول
first_project_name = data[0]["name"]
print(f"\nاسم المشروع الأول: {first_project_name}")

# الوصول إلى حالة المشروع الثاني
second_project_status = data[1]["status"]
print(f"حالة المشروع الثاني: {second_project_status}")

# الوصول إلى أول مهمة للمشروع الأول
first_project_first_task = data[0]["tasks"][0]["description"]
print(f"أول مهمة في المشروع الأول: {first_project_first_task}")

# الوصول إلى حالة إكمال المهمة الثانية للمشروع الأول
first_project_second_task_completed = data[0]["tasks"][1]["completed"]
print(f"هل المهمة الثانية للمشروع الأول مكتملة؟ {first_project_second_task_completed}")

الخطوة 3: معالجة وتصفية البيانات

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

print("\nالمشاريع قيد التقدم ومهامها غير المكتملة:")
# التكرار عبر كل مشروع في القائمة
for project in data:
    # التحقق مما إذا كان المشروع قيد التقدم
    if project["status"] == "قيد التقدم":
        print(f"\n- المشروع: {project['name']} (المعرف: {project['id']})")
        print("  المهام غير المكتملة:")
        # التكرار عبر المهام داخل المشروع الحالي
        for task in project["tasks"]:
            # التحقق مما إذا كانت المهمة غير مكتملة
            if not task["completed"]:
                print(f"    - {task['description']} (المعرف: {task['task_id']})")

# مثال آخر: جمع أسماء جميع المشاريع
project_names = [p["name"] for p in data]
print(f"\nجميع أسماء المشاريع: {project_names}")

الكود النهائي الكامل

إليك الكود المجمع الذي يوضح جميع الخطوات المذكورة أعلاه في سكربت بايثون واحد.

import json

# محاكاة لبيانات JSON قادمة من واجهة برمجة تطبيقات (API) كنص
api_response_json_string = """
[
    {
        "id": "proj-001",
        "name": "تطوير تطبيق ويب جديد",
        "status": "قيد التقدم",
        "tasks": [
            {"task_id": 1, "description": "تحديد المتطلبات", "completed": true},
            {"task_id": 2, "description": "تصميم قاعدة البيانات", "completed": false},
            {"task_id": 3, "description": "تطوير الواجهة الأمامية", "completed": false}
        ]
    },
    {
        "id": "proj-002",
        "name": "تحسين أداء الخادم",
        "status": "مكتمل",
        "tasks": [
            {"task_id": 1, "description": "تحليل سجلات الأداء", "completed": true},
            {"task_id": 2, "description": "تحسين استعلامات قاعدة البيانات", "completed": true}
        ]
    },
    {
        "id": "proj-003",
        "name": "إطلاق حملة تسويقية",
        "status": "قيد التقدم",
        "tasks": [
            {"task_id": 1, "description": "تخطيط المحتوى", "completed": true},
            {"task_id": 2, "description": "إنشاء المواد الإعلانية", "completed": false},
            {"task_id": 3, "description": "جدولة النشر", "completed": false}
        ]
    }
]
"""

# الخطوة 1: تحويل نص JSON إلى كائن بايثون
data = json.loads(api_response_json_string)
print(f"نوع البيانات بعد التحويل: {type(data)}")
print("البيانات المحولة (أول مشروع):")
print(data[0])

# الخطوة 2: الوصول إلى البيانات
first_project_name = data[0]["name"]
print(f"\nاسم المشروع الأول: {first_project_name}")

second_project_status = data[1]["status"]
print(f"حالة المشروع الثاني: {second_project_status}")

first_project_first_task = data[0]["tasks"][0]["description"]
print(f"أول مهمة في المشروع الأول: {first_project_first_task}")

# الخطوة 3: معالجة وتصفية البيانات
print("\nالمشاريع قيد التقدم ومهامها غير المكتملة:")
for project in data:
    if project["status"] == "قيد التقدم":
        print(f"\n- المشروع: {project['name']} (المعرف: {project['id']})")
        print("  المهام غير المكتملة:")
        for task in project["tasks"]:
            if not task["completed"]:
                print(f"    - {task['description']} (المعرف: {task['task_id']})")

project_names = [p["name"] for p in data]
print(f"\nجميع أسماء المشاريع: {project_names}")

# مثال إضافي: تحويل كائن بايثون إلى نص JSON (تسلسل)
new_project_data = {
    "id": "proj-004",
    "name": "إعداد بيئة الاختبار",
    "status": "لم يبدأ بعد",
    "tasks": []
}
# استخدام json.dumps() لتحويل كائن بايثون إلى نص JSON
# indent=2 يجعل النص منسقاً وسهل القراءة
new_project_json_string = json.dumps(new_project_data, indent=2, ensure_ascii=False)
print("\nبيانات مشروع جديد بصيغة JSON:")
print(new_project_json_string)

النتيجة المتوقعة

عند تشغيل السكربت أعلاه، ستحصل على مخرجات مطبوعة على الشاشة توضح:

  • نوع البيانات بعد تحويل نص JSON إلى كائن بايثون (سيكون <class 'list'>).
  • عرض لأول عنصر من البيانات المحولة (أول مشروع).
  • أسماء وحالات ومهام محددة تم الوصول إليها مباشرة.
  • قائمة مفصلة بالمشاريع التي لا تزال "قيد التقدم" مع المهام غير المكتملة لكل منها.
  • قائمة بجميع أسماء المشاريع المستخرجة.
  • تمثيل JSON منسق لمشروع جديد تم إنشاؤه في بايثون ثم تحويله إلى نص JSON.

هذه المخرجات تؤكد فهمك لكيفية قراءة وتحليل ومعالجة البيانات التي تستقبلها بصيغة JSON من واجهات برمجة التطبيقات.