← العودة إلى المدونة

Python و JSON: دليل شامل

تعلم كيفية العمل مع JSON في Python. القراءة، الكتابة، التحليل، والتحويل مع أمثلة عملية.

Big JSON Team15 دقيقة للقراءةprogramming
B

Big JSON Team

Technical Writer

Expert in JSON data manipulation, API development, and web technologies. Passionate about creating tools that make developers' lives easier.

15 دقيقة قراءة

# 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 لجميع احتياجاتك!

Share:

مقالات ذات صلة

Read in English