JSON إلى class في Python

أنشئ تعريفات dataclass في Python من JSON

نبذة عن JSON إلى class في Python

تنشئ أداة JSON إلى class في Python تعريفات class في Python تصف شكل عينة JSON أو JSON Schema: تعريفات أنواع، لا قاموس dict يحمل قيمك. تشغل الأداة quicktype-core داخل متصفحك. يصبح كل كائن متداخل تعريف class، وتحول أسماء الحقول إلى snake_case (first-name يصبح first_name)، وتستخدم الأنواع int وfloat وstr وbool وList وOptional من typing، إضافة إلى Union عندما يكون للقيمة نوعان وAny للمصفوفة الفارغة. الحقول الغائبة عن بعض عناصر المصفوفة تأخذ Optional[...] = None وتوضع بعد الحقول الإلزامية، كما تشترط dataclasses. في «النموذج»، اختر dataclasses أو نماذج Pydantic (BaseModel، مع Field(alias=...) حيث يعاد تسمية حقل) أو TypedDict (القاموس dict الذي تعيده json.loads، بمفاتيح JSON كما هي)؛ وفي «إصدار Python»، الصياغة من 3.6 إلى 3.10 أو أحدث. لا توجد افتراضيا أي دالة from_dict أو to_dict: اختر «الأنواع ودوال from_dict / to_dict» في «الكود» للحصول عليها. يمكن لصق JSON أو فتحه من ملف ‎.json أو ‎.txt.

مثال

شخصان؛ لدى Ada وحدها زوج، لذلك يصبح spouse من النوع Optional.

مدخل JSON

[{"first-name": "Ada", "age": 36, "spouse": {"name": "Bob"}},
 {"first-name": "Lin", "age": 29}]

مخرج Python

from dataclasses import dataclass
from typing import Optional

@dataclass
class Spouse:
    name: str

@dataclass
class RootElement:
    first_name: str
    age: int
    spouse: Optional[Spouse] = None

كيفية تحويل JSON إلى dataclasses في Python

  1. 1الصق JSON في «مدخل JSON»، أو انقر على «فتح ملف» لتحميل ملف ‎.json أو ‎.txt؛ المصفوفة التي فيها عدة سجلات تعطي أنواعا أفضل من سجل واحد. لاستخدام JSON Schema، اختر «JSON Schema» في «المصدر».
  2. 2اكتب «اسم الفئة»، ثم اختر «النموذج» و«إصدار Python» و«الكود».
  3. 3انقر على «تحويل» لترى تعريفات dataclass في «مخرج Python».
  4. 4تحقق من الحقول المعاد تسميتها: المفاتيح التي تطابق كلمات محجوزة في Python تأخذ بادئة، مثل root_class بدلا من class.
  5. 5انقر على «نسخ»، أو على «تنزيل» للحصول على ملف «model.py».

الصيغ والحدود

الإدخال
كائن JSON، أو مصفوفة كائنات، أو JSON Schema، ملصق أو مفتوح من ملف ‎.json أو ‎.txt؛ المصفوفة التي فيها قيم بسيطة فقط مثل [1, 2] ليس فيها تعريف class لإنشائه
الإخراج
تعريفات dataclass في Python أو نماذج Pydantic أو TypedDict، مع تعليقات أنواع typing، محفوظة في model.py؛ مع دوال from_dict / to_dict إذا اخترتها
الأسماء
حقول بصيغة snake_case؛ والمصفوفة في المستوى الأعلى تعطي تعريف class اسمه RootElement
إصدار Python
3.7 أو أحدث (الوحدة dataclasses) افتراضيا؛ 3.6 يعطي تعريفات class بسيطة مع ‎__init__‎، و3.9 يعطي list[int]، و3.10 يعطي int | None؛ ويتطلب TypedDict الإصدار 3.8 أو أحدث
التواريخ
str افتراضيا؛ وdatetime عند تحديد «التواريخ بالنوع datetime» وكانت القيمة تاريخا ووقتا بصيغة ISO 8601 مثل ‎2024-05-01T10:00:00Z، وكذلك لـ "format": "date-time" في JSON Schema؛ وتقرؤها دوال from_dict عندئذ بالحزمة python-dateutil؛ ويبقي TypedDict النوع str

أين يعالج نص JSON الخاص بك

تنتج تعريفات dataclass محليا، في متصفحك، بمحرك quicktype الذي يحمل عند تحويلك الأول؛ ولا يرسل إلينا نص JSON الخاص بك. إذا عرضت الأداة خطأ، يرسل نص الرسالة إلى سجل الأخطاء لدينا مع اسم الأداة واسم متصفحك وإصداره، بعد حذف المقاطع المقتبسة والأرقام الطويلة والعناوين منه.

الأسئلة الشائعة

هل تنشئ الأداة قاموس dict ببياناتي؟

لا. تكتب تعريفات dataclass تصف البيانات. للحصول على قاموس dict بقيمك، استخدم json.loads على النص؛ ولملء dataclass، مرر القيم المقابلة إلى دالة الإنشاء الخاصة بها، أو اختر «الأنواع ودوال from_dict / to_dict» في «الكود» واستدع root_from_dict(json.loads(text)).

كيف تحدد أنواع الحقول الاختيارية والحقول التي قيمتها null؟

Optional[T] = None، عندما يغيب المفتاح عن بعض عناصر المصفوفة أو تكون قيمته null في بعضها. المفتاح الذي قيمته null في كل العناصر ليس فيه ما يستنتج منه نوع، فيأخذ النوع None، لذلك أعطه قيمة حقيقية في العينة إذا أردت نوعا. في TypedDict، يكون هذا المفتاح Optional[T] في جزء معرف مع total=False.

هل تنشئ الأداة نماذج Pydantic؟

نعم. اختر «نماذج Pydantic» في «النموذج»: يرث كل تعريف class عندئذ من BaseModel، والحقل الذي يختلف اسمه عن مفتاحه في JSON، مثل first_name للمفتاح first-name، يأخذ Field(alias="first-name")، فتقرأ Root.model_validate(data) نص JSON وتعيد model_dump(by_alias=True) كتابته. والحقل الذي قد يخفي دالة من BaseModel، مثل json، يعاد تسميته json_‎.

هل يمكنها كتابة TypedDict بدلا من تعريفات class؟

نعم. اختر «TypedDict» في «النموذج» لوصف القاموس dict الذي تعيده json.loads، دون تحويله: تبقى المفاتيح مفاتيح JSON، والمفتاح الذي ليس اسما صالحا في Python، مثل first-name، يستخدم الصيغة TypedDict("Name", {...})، ويصبح تعداد enum في JSON Schema من النوع Literal، ويبقى التاريخ str. يتطلب TypedDict الإصدار Python 3.8 أو أحدث.

هل يمكنني البدء من JSON Schema؟

نعم. اختر «JSON Schema» في «المصدر»، ثم الصق المخطط أو افتحه. تأتي الأنواع والخصائص الإلزامية (وتصبح الأخرى Optional مع ‎= None‎) وتعدادات enum (تعريف class من النوع Enum) وتنسيقات date-time (datetime) من المخطط. لا يتبع المرجع ‎$ref‎ إلا داخل المستند (‎#/definitions/‎… أو ‎#/$defs/‎…): لا ينزل أبدا مخطط موجود في عنوان آخر، وتذكر الصفحة ذلك.

هل يميز بين الأعداد الصحيحة والأعداد العشرية؟

نعم. تأخذ الأعداد الصحيحة النوع int، وتأخذ الأعداد المكتوبة بنقطة عشرية أو بأس النوع float، حتى 10.0، فتبقى قيمة تصل لاحقا مثل 10.5 مطابقة للتعليق النوعي.

نصائح وحيل

  • ✓أعد تسمية RootElement أو Root باسم يصف سجلاتك قبل استخدام تعريفات class.