تكرار السؤال: …
الإجابة المختصرة
حوّل النص بـ json.loads، ثم تحقق من الشكل والأنواع عند الحدود، ثم حوّله إلى نموذج داخلي موثوق قبل استخدامه في منطق التطبيق.
الشرح
json.loads يضمن فقط أن النص JSON صالح، ولا يضمن وجود الحقول أو أنواعها أو قواعد العمل. افصل ثلاث خطوات: parsing (قد يرمي JSONDecodeError)، ثم validation (حقول مفقودة أو أنواع خاطئة)، ثم mapping إلى نموذج الـ domain. أعد أخطاء تميز بين JSON مشوه و payload ناقص. ولاحظ أن json يحوّل الأعداد العشرية إلى float، فاستخدم parse_float=Decimal للمبالغ المالية.
مثال بالكود
import json
from decimal import Decimal
def parse_payment(body: str) -> Payment:
try:
data = json.loads(body, parse_float=Decimal)
except json.JSONDecodeError as err:
raise BadRequest("malformed JSON") from err
if not isinstance(data, dict) or "amount" not in data:
raise BadRequest("amount is required")
return Payment(amount=Decimal(data["amount"]), currency=data.get("currency", "EGP"))أخطاء شائعة
- استخدام float للمبالغ المالية القادمة من JSON.
- الوصول إلى data["field"] مباشرة دون التحقق فيظهر KeyError كخطأ 500.