1. ما هو JSON؟ (المعرفة الأساسية)
نظرة عامة على JSON
JSON (JavaScript Object Notation) هو تنسيق بيانات يُستخدم بشكل متكرر في تبادل المعلومات بين العميل والخادم. يتميز بكونه خفيف الوزن وسهل القراءة وبهيكل بسيط، مما يجعله شائعًا في تطبيقات الويب وتطبيقات الهواتف المحمولة. JSON عبارة عن نص يمكن التعامل معه بسهولة بأي لغة برمجة، مما يمنحه مرونة عالية جدًا.
البنية الأساسية لـ JSON
يمثل JSON البيانات في شكل أزواج من المفاتيح والقيم. على سبيل المثال:
{
"الاسم": "ساتو",
"العمر": 30,
"الهوايات": ["القراءة", "الأفلام"]
}
في هذا المثال، الاسم
هو نص، العمر
هو رقم، والهوايات
هي مصفوفة. بفضل بساطته وسهولة قراءته، يعتبر JSON فعالًا جدًا في تبادل البيانات.
مميزات JSON
- خفيف وفعال: كونه نصيًا يقلل من حجم البيانات المنقولة ويخفف من عبء الشبكة.
- عالي التوافق: مدعوم تقريبًا في جميع لغات البرمجة ويمكن استخدامه عبر منصات متعددة.
- سهولة التحليل: سهل القراءة والكتابة، وهو أداة قوية خصوصًا عند التعامل مع واجهات API.
2. التعامل مع JSON في Python (الأساسيات)
وحدة json
في Python
في Python، يمكن استخدام وحدة json
لقراءة وكتابة بيانات JSON بسهولة. على سبيل المثال، لتحويل JSON إلى قاموس (dictionary) في Python:
import json
json_data = '{"الاسم": "ساتو", "العمر": 30}'
python_obj = json.loads(json_data)
print(python_obj) # {'الاسم': 'ساتو', 'العمر': 30}
وبالعكس، لتحويل كائن Python إلى JSON:
python_obj = {"الاسم": "ساتو", "العمر": 30}
json_data = json.dumps(python_obj, ensure_ascii=False)
print(json_data) # {"الاسم": "ساتو", "العمر": 30}
القراءة والكتابة من/إلى ملف
يمكن أيضًا قراءة بيانات JSON من ملف أو كتابتها في ملف:
# قراءة من ملف
with open('data.json', 'r') as f:
data = json.load(f)
# الكتابة إلى ملف
with open('data.json', 'w') as f:
json.dump(python_obj, f, ensure_ascii=False)
3. التعامل مع JSON في Python (التطبيق العملي)
استخدام وحدة requests للتواصل مع API
باستخدام وحدة requests
، يمكن إرسال واستقبال بيانات JSON بسهولة عبر API. مثال على إرسال طلب POST:
إرسال بيانات JSON عبر POST
import requests
url = 'https://example.com/api'
data = {'الاسم': 'ساتو', 'العمر': 30}
response = requests.post(url, json=data)
json_response = response.json()
print(json_response)
استقبال بيانات JSON عبر GET
باستخدام طلب GET يمكن استرجاع بيانات JSON من API:
response = requests.get('https://example.com/api/user/1')
data = response.json()
print(data)

4. التعامل مع الأخطاء وأفضل الممارسات
التعامل مع الأخطاء أثناء التواصل مع API
عند حدوث خطأ أثناء الاتصال بـ API، من المهم التعامل معه بشكل صحيح. المثال التالي يوضح كيفية التعامل مع أخطاء الشبكة أو انتهاء المهلة:
try:
response = requests.post(url, json=data)
response.raise_for_status()
except requests.exceptions.HTTPError as errh:
print("خطأ HTTP:", errh)
except requests.exceptions.ConnectionError as errc:
print("خطأ في الاتصال:", errc)
except requests.exceptions.Timeout as errt:
print("خطأ مهلة:", errt)
except requests.exceptions.RequestException as err:
print("خطأ غير متوقع:", err)
إعادة المحاولة
إذا كانت الشبكة غير مستقرة، يمكن تنفيذ آلية إعادة المحاولة باستخدام Retry
:
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
response = session.get(url)
5. التحقق من صحة JSON
التحقق باستخدام مكتبة jsonschema
للتحقق مما إذا كانت بيانات JSON المستلمة من API مطابقة للتنسيق المتوقع يمكن استخدام مكتبة jsonschema
:
from jsonschema import validate, ValidationError
schema = {
"type": "object",
"properties": {
"الاسم": {"type": "string"},
"العمر": {"type": "number"}
},
"required": ["الاسم", "العمر"]
}
json_data = {"الاسم": "ساتو", "العمر": 30}
try:
validate(instance=json_data, schema=schema)
print("JSON صالح")
except ValidationError as e:
print("خطأ في التحقق:", e)
يمكن التعامل مع مخططات معقدة أو كائنات متداخلة، مما يضمن صحة البيانات المستلمة من API.
6. أفضل الممارسات الأمنية
إدارة مفاتيح API
يُنصح بعدم تخزين مفاتيح API مباشرة في الكود، بل في متغيرات بيئية لتقليل المخاطر الأمنية:
import os
api_key = os.getenv('API_KEY')
تنقية البيانات
قبل إرسال مدخلات المستخدم إلى الخادم، يجب تنقيتها بشكل صحيح لتجنب هجمات مثل SQL Injection أو XSS:
from html import escape
safe_data = escape(user_input)