📄 کار با JSON در پایتون
JSON (JavaScript Object Notation) یک فرمت سبک برای تبادل داده است که هم برای انسان خوانا و هم برای ماشین قابل پردازش است.
پایتون با ماژول json امکانات کاملی برای تبدیل دادههای پایتون به JSON (سریالسازی) و تبدیل JSON به دادههای پایتون (دیسریالسازی) فراهم میکند.
کاربردها: ذخیرهسازی داده، ارتباط با APIها، تنظیمات برنامه، و تبادل داده بین سیستمها.
🔹 ساختار JSON
🔹 تبدیل پایتون به JSON با json.dumps()
import json
# داده پایتون
data = {
"name": "Saba",
"age": 28,
"is_student": False,
"courses": ["Python", "Data Science", "AI"],
"address": {
"city": "Tehran",
"zip": "12345"
},
"grades": None
}
# تبدیل به JSON
json_string = json.dumps(data)
print("JSON string:")
print(json_string)
# JSON با فرمت زیبا (indent)
json_pretty = json.dumps(data, indent=4)
print("\nPretty JSON:")
print(json_pretty)
⏳ برای اجرا دکمه را بزنید...
🔹 تبدیل JSON به پایتون با json.loads()
import json
# داده JSON (رشته)
json_string = """
{
"name": "Saba",
"age": 28,
"is_student": false,
"courses": ["Python", "Data Science", "AI"]
}
"""
# تبدیل به پایتون
data = json.loads(json_string)
print("Python data:")
print(f"Name: {data['name']}")
print(f"Age: {data['age']}")
print(f"Is student: {data['is_student']}")
print(f"Courses: {', '.join(data['courses'])}")
⏳ برای اجرا دکمه را بزنید...
🔹 خواندن و نوشتن فایل JSON
import json
# نوشتن در فایل JSON (dump)
data = {
"name": "Saba",
"age": 28,
"skills": ["Python", "AI", "Data Science"]
}
with open("person.json", "w") as file:
json.dump(data, file, indent=4)
print("Data written to person.json")
# خواندن از فایل JSON (load)
with open("person.json", "r") as file:
loaded_data = json.load(file)
print("\nData loaded from file:")
print(loaded_data)
# نمایش با فرمت زیبا
print("\nPretty print:")
print(json.dumps(loaded_data, indent=2))
⏳ برای اجرا دکمه را بزنید...
🔹 سفارشیسازی با پارامترها
import json
data = {
"name": "Saba",
"age": 28,
"is_active": True,
"scores": [18.5, 19.0, 17.5]
}
# sort_keys: مرتبسازی کلیدها
sorted_json = json.dumps(data, sort_keys=True, indent=2)
print("Sorted keys:")
print(sorted_json)
# separators: حذف فاصلههای اضافی
compact_json = json.dumps(data, separators=(",", ":"))
print("\nCompact JSON:")
print(compact_json)
# ensure_ascii: پشتیبانی از کاراکترهای غیرASCII
persian_data = {"name": "سارا", "city": "تهران"}
ascii_json = json.dumps(persian_data, ensure_ascii=False)
print("\nPersian characters (ensure_ascii=False):")
print(ascii_json)
# skipkeys: نادیده گرفتن کلیدهای غیرمعتبر
invalid_data = {1: "one", 2: "two", "three": 3}
try:
json.dumps(invalid_data)
except TypeError as e:
print(f"\nError: {e}")
# با skipkeys (نادیده گرفتن کلیدهای غیررشتهای)
result = json.dumps(invalid_data, skipkeys=True)
print(f"With skipkeys: {result}")
⏳ برای اجرا دکمه را بزنید...
🔹 مدیریت خطا در JSON
import json
# JSON نامعتبر
invalid_json = '{"name": "Saba", "age": 28,}' # کامای اضافی
try:
data = json.loads(invalid_json)
except json.JSONDecodeError as e:
print(f"JSON Decode Error: {e}")
# داده پایتون با کلید غیررشتهای
invalid_data = {1: "one", 2: "two"}
try:
json.dumps(invalid_data)
except TypeError as e:
print(f"Type Error: {e}")
# مدیریت با skipkeys
result = json.dumps(invalid_data, skipkeys=True)
print(f"Result with skipkeys: {result}")
⏳ برای اجرا دکمه را بزنید...
🔹 کار با کلاسهای سفارشی
import json
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
# تابع تبدیل به دیکشنری
def person_to_dict(obj):
if isinstance(obj, Person):
return {
"name": obj.name,
"age": obj.age,
"city": obj.city,
"type": "Person"
}
raise TypeError(f"Object of type {type(obj)} is not JSON serializable")
# تابع تبدیل از دیکشنری به شیء
def dict_to_person(obj):
if "type" in obj and obj["type"] == "Person":
return Person(obj["name"], obj["age"], obj["city"])
return obj
# استفاده
person = Person("Saba", 28, "Tehran")
# تبدیل به JSON با default
person_json = json.dumps(person, default=person_to_dict, indent=2)
print("Person as JSON:")
print(person_json)
# تبدیل JSON به شیء با object_hook
json_string = '{"name": "Ali", "age": 30, "city": "Shiraz", "type": "Person"}'
person_obj = json.loads(json_string, object_hook=dict_to_person)
print(f"\nPerson object:")
print(f"Name: {person_obj.name}")
print(f"Age: {person_obj.age}")
print(f"City: {person_obj.city}")
⏳ برای اجرا دکمه را بزنید...
🔹 نمونه JSON پیچیده
import json
# داده پیچیده: لیستی از دانشجویان با نمرات
complex_data = {
"university": "Tehran University",
"semester": "Fall 2024",
"students": [
{
"name": "Saba",
"age": 22,
"courses": [
{"name": "Math", "score": 18.5},
{"name": "Physics", "score": 19.0},
{"name": "CS", "score": 17.5}
]
},
{
"name": "Ali",
"age": 24,
"courses": [
{"name": "Math", "score": 15.0},
{"name": "Physics", "score": 14.5},
{"name": "CS", "score": 16.0}
]
}
]
}
# تبدیل به JSON با فرمت زیبا
json_str = json.dumps(complex_data, indent=2)
print("Complex JSON:")
print(json_str)
# بارگذاری مجدد
loaded_data = json.loads(json_str)
# محاسبه میانگین نمرات هر دانشجو
for student in loaded_data["students"]:
scores = [course["score"] for course in student["courses"]]
avg = sum(scores) / len(scores)
print(f"{student['name']} average: {avg:.2f}")
⏳ برای اجرا دکمه را بزنید...
🔹 کار با JSON در API (نمونه)
import json
import requests
# دریافت داده از یک API (مثال فرضی)
# response = requests.get("https://api.example.com/users")
# data = response.json()
# شبیهسازی داده JSON
api_response = """
{
"status": "success",
"data": {
"users": [
{"id": 1, "name": "Saba", "email": "[email protected]"},
{"id": 2, "name": "Ali", "email": "[email protected]"}
]
}
}
"""
data = json.loads(api_response)
# پردازش داده
if data["status"] == "success":
users = data["data"]["users"]
for user in users:
print(f"User {user['id']}: {user['name']} ({user['email']})")
🔹 مثال جامع: سیستم ذخیرهسازی پیکربندی
import json
import os
class ConfigManager:
def __init__(self, filename="config.json"):
self.filename = filename
self.config = self.load_config()
def load_config(self):
"""بارگذاری پیکربندی از فایل JSON"""
if os.path.exists(self.filename):
with open(self.filename, "r") as file:
return json.load(file)
return {
"app_name": "MyApp",
"version": "1.0.0",
"debug": False,
"database": {
"host": "localhost",
"port": 5432,
"user": "admin",
"password": "secret"
},
"features": {
"dark_mode": True,
"notifications": True
}
}
def save_config(self):
"""ذخیره پیکربندی در فایل JSON"""
with open(self.filename, "w") as file:
json.dump(self.config, file, indent=4)
print(f"Config saved to {self.filename}")
def get(self, key, default=None):
"""دریافت مقدار از پیکربندی"""
keys = key.split(".")
value = self.config
for k in keys:
if isinstance(value, dict) and k in value:
value = value[k]
else:
return default
return value
def set(self, key, value):
"""تنظیم مقدار در پیکربندی"""
keys = key.split(".")
config = self.config
for k in keys[:-1]:
if k not in config or not isinstance(config[k], dict):
config[k] = {}
config = config[k]
config[keys[-1]] = value
self.save_config()
def show_config(self):
"""نمایش پیکربندی به صورت JSON"""
print(json.dumps(self.config, indent=2))
# استفاده
config_mgr = ConfigManager("app_config.json")
# نمایش پیکربندی
print("Current configuration:")
config_mgr.show_config()
# دریافت مقادیر
print(f"\nApp name: {config_mgr.get('app_name')}")
print(f"Debug mode: {config_mgr.get('debug')}")
print(f"Database host: {config_mgr.get('database.host')}")
print(f"Dark mode: {config_mgr.get('features.dark_mode')}")
# تغییر مقادیر
config_mgr.set("debug", True)
config_mgr.set("database.password", "new_password")
config_mgr.set("features.dark_mode", False)
print("\nUpdated configuration:")
config_mgr.show_config()
⏳ برای اجرا دکمه را بزنید...
📌 نکات کلیدی
- ✅ ماژول
jsonبرای کار با JSON در پایتون استفاده میشود. - ✅
json.dumps()برای سریالسازی (پایتون → JSON). - ✅
json.loads()برای دیسریالسازی (JSON → پایتون). - ✅
json.dump()وjson.load()برای کار با فایل. - ✅ پارامترهای مفید:
indent،sort_keys،ensure_ascii،skipkeys. - ✅ برای کلاسهای سفارشی از
defaultوobject_hookاستفاده کنید. - ✅ همیشه خطاهای JSON را مدیریت کنید (
JSONDecodeError). - ✅ JSON در APIها، تنظیمات و ذخیرهسازی داده کاربرد گسترده دارد.