Python و JSON: دليل شامل
تعلم كيفية العمل مع JSON في Python. القراءة، الكتابة، التحليل، والتحويل مع أمثلة عملية.
Big JSON Team
• Technical WriterExpert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.
# Python و JSON: دليل شامل
Python توفر دعماً ممتازاً للعمل مع JSON من خلال وحدة json المدمجة.
مقدمة
لماذا JSON مع Python؟
- مدمج - لا حاجة لتثبيت مكتبات خارجية
- سهل - API بسيط وواضح
- سريع - معالجة فعالة
- موثوق - مستقر ومختبر جيداً
استيراد وحدة json
import json
# استيراد وظائف محددة
from json import loads, dumps, load, dump
قراءة JSON
من نص (String)
import json
# نص JSON
json_string = '{"الاسم": "أحمد", "العمر": 30}'
# تحويل إلى قاموس Python
data = json.loads(json_string)
print(data['الاسم']) # أحمد
print(data['العمر']) # 30
print(type(data)) # <class 'dict'>
من ملف
import json
# قراءة من ملف
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data)
معالجة الأخطاء
import json
json_string = '{"الاسم": "أحمد", "العمر": 30,}' # خطأ: فاصلة زائدة
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f"خطأ في التحليل: {e}")
print(f"السطر: {e.lineno}, العمود: {e.colno}")
كتابة JSON
إلى نص (String)
import json
# قاموس Python
data = {
"الاسم": "أحمد",
"العمر": 30,
"المدينة": "الرياض"
}
# تحويل إلى JSON
json_string = json.dumps(data, ensure_ascii=False)
print(json_string)
# {"الاسم": "أحمد", "العمر": 30, "المدينة": "الرياض"}
إلى ملف
import json
data = {
"الاسم": "أحمد",
"العمر": 30,
"المهارات": ["Python", "JavaScript", "SQL"]
}
# كتابة إلى ملف
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
تنسيق JSON
import json
data = {"الاسم": "أحمد", "العمر": 30}
# بدون تنسيق (مضغوط)
compact = json.dumps(data, ensure_ascii=False)
print(compact)
# {"الاسم": "أحمد", "العمر": 30}
# مع تنسيق (مسافة بادئة 2)
formatted = json.dumps(data, ensure_ascii=False, indent=2)
print(formatted)
# {
# "الاسم": "أحمد",
# "العمر": 30
# }
# مع تنسيق (مسافة بادئة 4)
formatted4 = json.dumps(data, ensure_ascii=False, indent=4)
خيارات json.dumps()
ensure_ascii
import json
data = {"الاسم": "أحمد"}
# مع ensure_ascii=True (افتراضي)
ascii_json = json.dumps(data)
print(ascii_json)
# {"\u0627\u0644\u0627\u0633\u0645": "\u0623\u062d\u0645\u062f"}
# مع ensure_ascii=False (للعربية)
arabic_json = json.dumps(data, ensure_ascii=False)
print(arabic_json)
# {"الاسم": "أحمد"}
sort_keys
import json
data = {
"العمر": 30,
"الاسم": "أحمد",
"id": 1
}
# بدون ترتيب
unordered = json.dumps(data, ensure_ascii=False)
# مع ترتيب
ordered = json.dumps(data, ensure_ascii=False, sort_keys=True)
print(ordered)
# {"id": 1, "الاسم": "أحمد", "العمر": 30}
separators
import json
data = {"الاسم": "أحمد", "العمر": 30}
# فواصل مخصصة (بدون مسافات)
compact = json.dumps(data, ensure_ascii=False, separators=(',', ':'))
print(compact)
# {"الاسم":"أحمد","العمر":30}
# فواصل مخصصة (مع مسافات)
spaced = json.dumps(data, ensure_ascii=False, separators=(', ', ': '))
print(spaced)
# {"الاسم": "أحمد", "العمر": 30}
تحويل أنواع البيانات
Python إلى JSON
import json
# أنواع البيانات المدعومة
data = {
"نص": "مرحباً", # str -> string
"عدد": 42, # int -> number
"عشري": 3.14, # float -> number
"منطقي": True, # bool -> boolean
"لاشيء": None, # None -> null
"قائمة": [1, 2, 3], # list -> array
"مجموعة": (4, 5, 6), # tuple -> array
"قاموس": {"مفتاح": "قيمة"} # dict -> object
}
json_string = json.dumps(data, ensure_ascii=False, indent=2)
print(json_string)
JSON إلى Python
import json
json_string = '''
{
"نص": "مرحباً",
"عدد": 42,
"عشري": 3.14,
"منطقي": true,
"لاشيء": null,
"قائمة": [1, 2, 3],
"قاموس": {"مفتاح": "قيمة"}
}
'''
data = json.loads(json_string)
print(type(data['نص'])) # <class 'str'>
print(type(data['عدد'])) # <class 'int'>
print(type(data['عشري'])) # <class 'float'>
print(type(data['منطقي'])) # <class 'bool'>
print(type(data['لاشيء'])) # <class 'NoneType'>
print(type(data['قائمة'])) # <class 'list'>
print(type(data['قاموس'])) # <class 'dict'>
العمل مع التواريخ
تحويل التواريخ إلى JSON
import json
from datetime import datetime, date
# محول مخصص
def json_serial(obj):
"""محول لأنواع البيانات غير المدعومة"""
if isinstance(obj, (datetime, date)):
return obj.isoformat()
raise TypeError(f"النوع {type(obj)} غير مدعوم")
data = {
"الاسم": "أحمد",
"تاريخ_الميلاد": date(1994, 5, 15),
"تاريخ_التسجيل": datetime.now()
}
json_string = json.dumps(
data,
ensure_ascii=False,
indent=2,
default=json_serial
)
print(json_string)
قراءة التواريخ من JSON
import json
from datetime import datetime
json_string = '''
{
"الاسم": "أحمد",
"تاريخ_التسجيل": "2026-01-16T10:30:00"
}
'''
data = json.loads(json_string)
# تحويل النص إلى datetime
data['تاريخ_التسجيل'] = datetime.fromisoformat(
data['تاريخ_التسجيل']
)
print(type(data['تاريخ_التسجيل'])) # <class 'datetime.datetime'>
العمل مع API
طلب GET
import json
import urllib.request
# طلب بيانات
url = 'https://api.example.com/users/1'
response = urllib.request.urlopen(url)
data = json.loads(response.read())
print(data)
باستخدام requests
import requests
# طلب GET
response = requests.get('https://api.example.com/users/1')
data = response.json() # تحويل تلقائي من JSON
print(data)
# طلب POST
new_user = {
"الاسم": "أحمد",
"البريد": "ahmed@example.com"
}
response = requests.post(
'https://api.example.com/users',
json=new_user # تحويل تلقائي إلى JSON
)
print(response.json())
معالجة JSON الكبير
القراءة بالتدفق
import ijson
# قراءة ملف كبير بكفاءة
with open('large.json', 'rb') as f:
# معالجة كل عنصر على حدة
parser = ijson.items(f, 'المستخدمون.item')
for user in parser:
print(user['الاسم'])
الكتابة بالتدفق
import json
# كتابة ملف كبير
with open('large.json', 'w', encoding='utf-8') as f:
f.write('[\n')
for i in range(1000000):
user = {
"id": i,
"الاسم": f"مستخدم {i}"
}
json.dump(user, f, ensure_ascii=False)
if i < 999999:
f.write(',\n')
f.write('\n]')
JSONPath
استخدام jsonpath-ng
from jsonpath_ng import parse
data = {
"المستخدمون": [
{"الاسم": "أحمد", "العمر": 30},
{"الاسم": "فاطمة", "العمر": 25}
]
}
# البحث باستخدام JSONPath
jsonpath_expr = parse('$.المستخدمون[*].الاسم')
matches = [match.value for match in jsonpath_expr.find(data)]
print(matches) # ['أحمد', 'فاطمة']
JSON Schema
التحقق من الصحة
import jsonschema
from jsonschema import validate
# تعريف Schema
schema = {
"type": "object",
"properties": {
"الاسم": {"type": "string"},
"العمر": {"type": "number", "minimum": 0}
},
"required": ["الاسم"]
}
# البيانات
data = {
"الاسم": "أحمد",
"العمر": 30
}
# التحقق
try:
validate(instance=data, schema=schema)
print("البيانات صالحة")
except jsonschema.exceptions.ValidationError as e:
print(f"خطأ في التحقق: {e.message}")
مكتبات JSON بديلة
ujson (أسرع)
import ujson
# أسرع من json القياسي
data = ujson.loads(json_string)
json_string = ujson.dumps(data, ensure_ascii=False)
orjson (الأسرع)
import orjson
# الأسرع
data = orjson.loads(json_bytes)
json_bytes = orjson.dumps(data) # يعيد bytes
simplejson
import simplejson as json
# مماثل للمكتبة القياسية مع ميزات إضافية
data = json.loads(json_string, use_decimal=True)
أمثلة عملية
قراءة ملف تكوين
import json
def load_config(filename='config.json'):
"""قراءة ملف التكوين"""
try:
with open(filename, 'r', encoding='utf-8') as f:
return json.load(f)
except FileNotFoundError:
return {}
except json.JSONDecodeError as e:
print(f"خطأ في ملف التكوين: {e}")
return {}
# الاستخدام
config = load_config()
database_host = config.get('database', {}).get('host', 'localhost')
حفظ بيانات المستخدم
import json
from pathlib import Path
class UserData:
def __init__(self, filename='users.json'):
self.filename = filename
self.data = self.load()
def load(self):
"""تحميل البيانات"""
if Path(self.filename).exists():
with open(self.filename, 'r', encoding='utf-8') as f:
return json.load(f)
return []
def save(self):
"""حفظ البيانات"""
with open(self.filename, 'w', encoding='utf-8') as f:
json.dump(self.data, f, ensure_ascii=False, indent=2)
def add_user(self, user):
"""إضافة مستخدم"""
self.data.append(user)
self.save()
# الاستخدام
users = UserData()
users.add_user({"الاسم": "أحمد", "العمر": 30})
تحويل CSV إلى JSON
import csv
import json
def csv_to_json(csv_file, json_file):
"""تحويل CSV إلى JSON"""
data = []
with open(csv_file, 'r', encoding='utf-8') as f:
csv_reader = csv.DictReader(f)
for row in csv_reader:
data.append(row)
with open(json_file, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
# الاستخدام
csv_to_json('data.csv', 'data.json')
أفضل الممارسات
1. استخدم ensure_ascii=False للعربية
# صحيح
json.dumps(data, ensure_ascii=False)
# خطأ (للنصوص العربية)
json.dumps(data) # سينتج Unicode escape sequences
2. استخدم with للملفات
# صحيح
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# خطأ (قد ينسى إغلاق الملف)
f = open('data.json', 'r')
data = json.load(f)
f.close()
3. معالجة الأخطاء
try:
data = json.loads(json_string)
except json.JSONDecodeError as e:
print(f"خطأ: {e}")
# معالجة الخطأ
الملخص
Python و JSON:
- سهل الاستخدام
- مدمج في اللغة
- سريع وفعال
- دعم ممتاز
استخدم وحدة json لجميع احتياجاتك!
مقالات ذات صلة
JavaScript و JSON: الدليل الكامل
تعلم كيفية العمل مع JSON في JavaScript. JSON.parse، JSON.stringify، وأفضل الممارسات.
JSON APIs وخدمات REST
تعلم كيفية العمل مع JSON في REST APIs. أفضل الممارسات، أمثلة، وتقنيات متقدمة.
التعامل مع ملفات JSON الكبيرة
تقنيات وأفضل الممارسات للتعامل مع ملفات JSON الكبيرة بكفاءة. أمثلة عملية للقراءة والمعالجة.