📦 فهم JSON في بايثون: لغة البيانات العالمية 🔄
مرحباً بك في درس جديد من أكاديمية كودكس! 🎉 تخيل أن لديك تطبيق ويب مكتوباً بلغة بايثون، وتحتاج إلى إرسال بيانات المستخدم إلى تطبيق آخر مكتوب بلغة جافا سكريبت. كيف يمكن لهاتين اللغتين المختلفتين أن تتحدثا معاً؟ الإجابة تكمن في JSON!
JSON، أو JavaScript Object Notation، هي صيغة قياسية لتبادل البيانات. تتميز بأنها خفيفة الوزن وسهلة القراءة لكل من البشر والآلات، وتستخدم على نطاق واسع في تطبيقات الويب وواجهات برمجة التطبيقات (APIs). لحسن الحظ، تأتي بايثون مع مكتبة مدمجة اسمها json تجعل التعامل مع هذه الصيغة سهلاً جداً. هيا نبدأ! 🚀
🔍 ما هو JSON؟ هيا نرى شكله!
في جوهره، JSON هو مجرد نص (سلسلة نصية) مكتوب بطريقة محددة. دعنا نرى مثالاً لبيانات مستخدم مخزنة بتنسيق JSON:
{
"name": "أحمد",
"age": 25,
"is_student": true,
"courses": ["بايثون", "جافا سكريبت", "قواعد البيانات"]
}
كما ترى، البيانات تُكتب على شكل أزواج مفتاح: قيمة (Key: Value). الأقواس المتعرجة {} تحدد كائن (Object)، بينما تحدد الأقواس المربعة [] قائمة (Array). هذا الشكل مشابه جداً للقواميس (Dictionaries) والقوائم (Lists) في بايثون! وهذا هو سر سهولة التعامل معها.
⚙️ المكتبة السحرية: json
لا حاجة لتثبيت أي شيء إضافي! مكتبة json جزء من المكتبة القياسية في بايثون. كل ما عليك هو استيرادها في بداية برنامجك:
# استيراد المكتبة
import json
هذه المكتبة تمنحنا أداتين رئيسيتين:
- التحويل من JSON إلى كائنات بايثون (التفكيك - Parsing).
- التحويل من كائنات بايثون إلى JSON (التشفير - Encoding).
📥 الجزء الأول: تحليل JSON - json.loads()
الكلمة loads تعني load string، أي "تحميل من سلسلة نصية". نستخدمها لتحويل سلسلة نصية (String) مكتوبة بتنسيق JSON إلى كائنات بايثون مألوفة (مثل القواميس والقوائم).
import json
# بيانات JSON مخزنة داخل سلسلة نصية في بايثون
json_string = '{"name": "سارة", "age": 30, "city": "الرياض"}'
# تحليل السلسلة النصية (JSON) إلى قاموس بايثون
python_dict = json.loads(json_string)
# الآن يمكننا التعامل مع البيانات كقاموس عادي في بايثون
print(python_dict["name"]) # المخرجات: سارة
print(type(python_dict)) # المخرجات: <class 'dict'>
في المثال أعلاه، لاحظ أن json_string محاطة بعلامتي اقتباس مفردة ' ' لأنها سلسلة نصية في بايثون، بينما محتواها الداخلي (المفاتيح والقيم النصية) محاط بعلامتي اقتباس مزدوجة " " كما هو مطلوب في صيغة JSON.
📤 الجزء الثاني: تحويل بايثون إلى JSON - json.dumps()
الكلمة dumps تعني dump string، أي "إخراج إلى سلسلة نصية". نستخدمها للتحويل العكسي: أخذ كائن بايثون (مثل قاموس) وتحويله إلى سلسلة نصية (String) بتنسيق JSON. هذا مفيد جداً عندما نريد إرسال بيانات من برنامجنا بايثون إلى نظام آخر.
import json
# بياناتنا كقاموس عادي في بايثون
python_dict = {
"product": "لابتوب",
"price": 3500.50,
"in_stock": True,
"colors": ["أسود", "فضي"]
}
# تحويل القاموس إلى سلسلة نصية بتنسيق JSON
json_string = json.dumps(python_dict)
print(json_string)
# المخرجات: {"product": "\u0644\u0627\u0628\u062a\u0648\u0628", "price": 3500.5, "in_stock": true, "colors": ["\u0623\u0633\u0648\u062f", "\u0641\u0636\u064a"]}
print(type(json_string)) # المخرجات: <class 'str'>
قد تلاحظ ظهور رموز غريبة مثل \u0644. هذا لأن dumps() تستخدم ترميز Unicode افتراضياً. لحل هذا، يمكننا استخدام المعامل ensure_ascii=False.
json_string_pretty = json.dumps(python_dict, ensure_ascii=False, indent=4)
print(json_string_pretty)
سيطبع هذا الكود البيانات بشكل منظم (بفضل indent=4) وبالنصوص العربية واضحة.
💾 العمل مع ملفات JSON: القراءة والكتابة
في العالم الحقيقي، غالباً ما تكون بيانات JSON مخزنة في ملفات منفصلة (مثل config.json أو data.json). مكتبة json توفر دوال مباشرة للتعامل مع الملفات.
القراءة من ملف JSON (json.load()):
import json
# فتح الملف وقراءة محتواه وتحويله مباشرة إلى كائن بايثون
with open('data.json', 'r', encoding='utf-8') as file:
data_from_file = json.load(file)
print(data_from_file["message"]) # نفترض أن الملف يحتوي على مفتاح اسمه "message"
الكتابة إلى ملف JSON (json.dump()):
import json
# البيانات التي نريد حفظها
my_data = {"project": "تعلم JSON", "level": "مبتدئ", "completed": True}
# فتح الملف للكتابة، وتحويل البيانات وحفظها فيه مباشرة
with open('my_info.json', 'w', encoding='utf-8') as file:
json.dump(my_data, file, ensure_ascii=False, indent=4)
print("تم حفظ البيانات في الملف بنجاح! ✅")
لاحظ أن الدوال التي تتعامل مع الملفات هي load() وdump() (بدون حرف s في النهاية)، بينما الدوال التي تتعامل مع السلاسل النصية مباشرة هي loads() وdumps() (بحرف s).
🎯 ملخص سريع: load vs loads & dump vs dumps
| الوظيفة | تستخدم مع | مثال |
|---|---|---|
json.load() |
ملف (File Object) | data = json.load(file) |
json.loads() |
سلسلة نصية (String) | data = json.loads(json_string) |
json.dump() |
ملف (File Object) | json.dump(data, file) |
json.dumps() |
سلسلة نصية (String) | json_string = json.dumps(data) |
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال