انتقل إلى المحتوى

تحويل JSON إلى أصناف بيانات Kotlin — Numio

يُنشئ data classes في Kotlin من عيّنة JSON. تصبح الأعداد الصحيحة Long والعشرية Double، ويحصل كل كائن متداخل على صنف خاص به، وتصبح المفاتيح المفقودة من بعض عناصر المصفوفة أنواعًا قابلة لـ null مثل Boolean?.

نمذجة استجابة REST لتطبيق Android يحلّل JSON باستخدام Jackson.

JSON

متى تستخدمها

  • نمذجة استجابة REST لتطبيق Android يحلّل JSON باستخدام Jackson.
  • إنشاء DTOs لخدمة Ktor أو Spring Boot من حمولة مثال.

طريقة الاستخدام

  1. الصق كائن JSON أو مصفوفة تمثيلية في محرر JSON؛ وأدرج عناصر مصفوفة تُظهر المفاتيح الاختيارية.
  2. اقرأ لوحة Kotlin: اسم الصنف الأعلى Root، وتُسمّى الأصناف المتداخلة بحسب مفاتيحها (يصبح projects هو Project).
  3. انسخ الأصناف، وأعد تسمية Root، واستبدل Any? أو Long حيث ينصّ عقد الـ API على غير ذلك.

إدخال JSON

{
  "id": 1024,
  "full_name": "Ada Lovelace",
  "email": null,
  "roles": ["admin", "editor"],
  "projects": [
    { "name": "Engine", "stars": 42 },
    { "name": "Notes", "stars": 7, "archived": true }
  ]
}

Kotlin data classes

import com.fasterxml.jackson.annotation.JsonProperty

data class Root(
    val id: Long,
    @JsonProperty("full_name")
    val fullName: String,
    val email: Any?,
    val roles: List<String>,
    val projects: List<Project>,
)

data class Project(
    val name: String,
    val stars: Long,
    val archived: Boolean?,
)

التفاصيل والقيود

يجري التحويل في متصفحك بوحدة WebAssembly الخاصة بـ json_typegen؛ ولا يُرفع الـ JSON. لا توجد إعدادات في هذه الصفحة.

تحصل المفاتيح التي ليست بصيغة camelCase على تعليق Jackson التوضيحي @JsonProperty والاستيراد com.fasterxml.jackson.annotation.JsonProperty. لا تُنشأ تعليقات kotlinx.serialization أو Moshi.

قيم null والمصفوفات الفارغة لا تحمل معلومات عن النوع، لذا تصبح Any? وList<Any?>.

الحقول القابلة لـ null ليس لها قيمة افتراضية (= null). أضف القيم الافتراضية بنفسك إذا كان الحقل قد يغيب عند إلغاء التسلسل.

FAQ

لماذا نوع العدد الصحيح Long وليس Int؟

يستخدم المولّد Long دائمًا للأعداد الصحيحة كي لا تفيض المعرّفات الكبيرة. الأعداد الأكبر من أن يتسع لها عدد صحيح 64 بت، أو المكتوبة بفاصلة عشرية، تصبح Double.

هل يمكنني تحويل مصفوفة JSON في المستوى الجذري؟

نعم. تُنتج المصفوفة الجذرية typealias، مثل typealias Root = List<Root2>;، إضافةً إلى data class Root2 لنوع العنصر. أعد تسمية كليهما بما يناسب شيفرتك.

لماذا أصبحت مصفوفة مختلطة قصيرة Pair<Long, String>؟

يعامل json_typegen المصفوفة القصيرة ذات العناصر المختلفة الأنواع على أنها tuple، فتصبح [1, "a"] هي Pair<Long, String>. غيّرها إلى List<Any> إذا كانت المصفوفة قائمة فعلًا.

المواصفات والمراجع