التخطي إلى المحتوى
Toova
جميع الأدوات

JSON إلى TypeScript و Go و Python و PHP و Rust

خصوصية بالتصميم — يعمل بالكامل في متصفحك

استنتاج تعريفات النوع الصحيحة من استجابة API حقيقية هو أحد تلك المهام التي يفترض أن تستغرق خمس ثوانٍ لكنها تلتهم خمس عشرة دقيقة. تقرأ هذه الأداة عيّنة JSON في متصفحك، وتتنقل عبر البنية، وتُصدر أنواعًا اصطلاحية لـ TypeScript أو Go أو Python أو PHP أو Rust — مع حقول اختيارية، واكتشاف تواريخ ISO، وتمييز صحيح بين الأعداد الصحيحة والعشرية.

كيف يعمل الاستنتاج

تجتاز الأداة شجرة JSON مرة واحدة، وتبني تمثيلًا وسيطًا: الأنواع الأولية تصبح string / int / float / bool / null، والمصفوفات تستنتج نوع العنصر من اتحاد أعضائها، والكائنات تنتج بنية تأتي أنواع حقولها من القيم. عندما يظهر حقل في بعض عناصر المصفوفة دون البعض الآخر، يُوسم على أنه اختياري ليتمكن النوع المُنتَج من فك ترميز البيانات الجزئية دون انهيار. الأرقام بدون كسر تُصدَر كـ int64 (Go) / int (Python) / i64 (Rust)، والأرقام ذات الكسر كـ float64 / float / f64. السلاسل المطابقة لـ ISO 8601 (`2024-03-15T10:30:00Z`) تصبح Date / time.Time / datetime / DateTimeInterface / chrono::DateTime.

نمط الإخراج لكل لغة

يتبع كل مُصدر اصطلاحات لغته المستهدفة. TypeScript: واجهات مُصدَّرة بصيغة `?:`. Go: structs مع وسوم `json:`، والحقول الاختيارية كمؤشرات مع `omitempty`. Python: `@dataclass`، الحقول المطلوبة أولًا و`Optional[T] = None` في النهاية (قاعدة ترتيب dataclass). PHP: classes نهائية بأنواع صارمة وتلميحات phpdoc `@var list<T>` للمصفوفات المُكتَبة. Rust: structs بـ `#[derive(Serialize, Deserialize)]`، و`Option<T>` للحقول القابلة للقيمة null، و`#[serde(rename)]` عندما يختلف اسم snake_case في Rust عن مفتاح JSON.

متى نستخدمها (ومتى لا)

يحل هذا المولّد أول 80% من العمل: الحصول على تعريف نوع يعمل من حمولة في ثوانٍ. لا يحل محل مخطط مكتوب يدويًا عندما تحتاج إلى قيود دقيقة (regex على السلاسل، min/max على الأرقام، اتحادات مميَّزة). للحالات تلك، خذ الإخراج كنقطة بداية وضيّق الأنواع. الكشف عن الحقول الاختيارية استدلالي — بناءً على ما هو موجود في عيّنتك — لذلك مرّر عدة عينات متنوعة إن أمكن.

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

هل يغادر JSON الذي ألصقه متصفحي؟
لا. المحلل اللغوي واستنتاج النوع وإصدار الكود كلها تعمل في JavaScript داخل علامة التبويب الخاصة بك. افتح لوحة Network أثناء التوليد — سترى صفر طلبات خارجة. آمن لحمولات الإنتاج التي تحتوي على رموز حقيقية وPII.
لماذا حقلي مُوسوم بأنه اختياري رغم أن له قيمة دائمًا؟
تُضبط علامة الاختياري عندما تحتوي مصفوفة على كائنات بهذا الحقل وأخرى بدونه. إذا ألصقت كائنًا واحدًا فلن يُوسَم شيء اختياريًا. إذا ألصقت مصفوفة من كائنات متطابقة فأيضًا. تُفعَّل العلامة فقط عندما يتغير الهيكل داخل المصفوفة.
كيف يُميَّز بين العدد الصحيح والعشري؟
يحتوي JSON على نوع رقمي واحد فقط. تفحص الأداة كل قيمة وتُصدر int عندما لا يحتوي القيمة على جزء كسري (`42`، `1000`)، وfloat عندما تحتوي (`3.14`، `99.0`). إذا مزجت مصفوفة بين الاثنين، يتسع النوع إلى float لتجنب فك ترميز خاسر.
هل يكتشف سلاسل تاريخ ISO؟
نعم. السلاسل المطابقة لـ `YYYY-MM-DD` أو `YYYY-MM-DDTHH:MM:SS[.sss][Z|±HH:MM]` تُصدَر كنوع التاريخ/الوقت الأصلي للغة (Date في TS، time.Time في Go، datetime في Python، DateTimeInterface في PHP، chrono::DateTime في Rust). تبقى تنسيقات أخرى كسلاسل.
هل أحتاج إلى تثبيت شيء لاستخدام الكود المُولَّد؟
TypeScript: لا شيء — نقي. Go: المكتبة القياسية فقط (time.Time عند وجود تواريخ ISO). Python: وحدة dataclasses القياسية. PHP: الأنواع الأصلية. Rust: يحتاج serde + chrono إذا كانت هناك تواريخ ISO. تُكتب الترويسات/الاستيرادات في الإخراج حيثما ينطبق.
هل يمكنني توليد أنواع لمصفوفة من الكائنات في الجذر؟
نعم. إذا كانت قيمة الجذر مصفوفة من الكائنات، تُنتج الأداة بنية للعنصر واسمًا مستعارًا للنوع على المستوى الأعلى للمصفوفة. مثلًا، JSON `[{...}, {...}]` مُسمَّى `Users` يُنتج واجهة `User` بالإضافة إلى `type Users = User[];` في TypeScript، أو `pub type Users = Vec<User>;` في Rust.