فك الترميز إلى Case Classes
طابق JSON مع أنواعك
فك الترميز إلى Case Classes درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
تربط Decoders بين JSON والأنواع
يعرف Decoder[A] كيفية قراءة قيمة Json وتحويلها إلى نوع Scala هو A.
توفر Circe برامج فك ترميز للأنواع البدائية والمجموعات مباشرةً، ويمكنها إنشاء برامج فك ترميز لفئات case الخاصة بك تلقائيًا.
فئة case مستهدفة
لنفترض أن واجهة API الخاصة بك تعيد سجلات مستخدمين. مثّل بنيتها باستخدام فئة case تتطابق أسماء حقولها مع مفاتيح JSON.
إن تطابق الأسماء هو ما يتيح لـ Circe اشتقاق برنامج فك ترميز دون أي توصيل يدوي.
case class User(name: String, age: Int, admin: Boolean)الاشتقاق التلقائي
استورد io.circe.generic.auto._، وستشتق Circe ضمنيًا Decoder[User] عند الطلب في أي موضع تحتاج إليه.
بعد ذلك تستدعي decode[User] دون أي تعليمات إضافية متكررة.
import io.circe.generic.auto._
import io.circe.parser.decode
val json = "{\"name\":\"Ada\",\"age\":36,\"admin\":true}"
val user = decode[User](json)
println(user) // Right(User(Ada,36,true))الاشتقاق شبه التلقائي
للحصول على أوقات ترجمة أفضل وتحكم صريح، استخدم io.circe.generic.semiauto.deriveDecoder.
عرّف برنامج فك الترميز مرة واحدة، عادةً في الكائن المرافق، وأعد استخدام النسخة نفسها في كل المواضع.
import io.circe.Decoder
import io.circe.generic.semiauto._
object User {
implicit val dec: Decoder[User] = deriveDecoder[User]
}إخفاقات فك الترميز
إذا كان حقل مطلوب مفقودًا أو من نوع غير صحيح، يفشل فك الترميز مع DecodingFailure.
يحمل الإخفاق history لعمليات المؤشر، محددًا بدقة الحقل الذي تسبب في المشكلة.
val bad = decode[User]("{\"name\":\"Ada\"}")
println(bad)
// Left(DecodingFailure at .age: Missing required field)الحقول الاختيارية في الفئات
اجعل الحقل من النوع Option[A] عندما يكون مفتاح JSON قابلًا للغياب أو قد تكون قيمته null.
تفك Circe تلقائيًا ترميز المفتاح المفقود إلى None، لذلك لا تحتاج إلى برنامج فك ترميز مخصص لمجرد دعم الاختيارية.
case class Account(id: Long, nickname: Option[String])
val a = decode[Account]("{\"id\":7}")
println(a) // Right(Account(7,None))القيم الافتراضية
يمكن للقيم الافتراضية في فئة case ملء مفاتيح JSON المفقودة، لكن فقط عند استخدام اشتقاق configured مفعّل فيه دعم القيم الافتراضية.
توفر وحدة circe-generic-extras ذلك عبر Configuration.default.withDefaults.
import io.circe.generic.extras._
implicit val cfg: Configuration =
Configuration.default.withDefaults
@ConfiguredJsonCodec
case class Settings(theme: String = "dark")فئات case المتداخلة
يتركب فك الترميز: فإذا كانت Circe قادرة على فك ترميز نوع كل حقل، فإنها تستطيع فك ترميز فئة تحتوي على فئات case أخرى متداخلة.
يتكرر الاشتقاق تلقائيًا، لذلك يتكفل استيراد واحد بالبنى المتداخلة بعمق.
case class Address(city: String)
case class Person(name: String, address: Address)
val p = decode[Person](
"{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}}")
println(p)إعادة تسمية الحقول
عندما تختلف مفاتيح JSON عن أسماء Scala، مثل snake_case، استخدم الاشتقاق المُعدّ مع Configuration.default.withSnakeCaseMemberNames.
يحوّل ذلك created_at إلى حقل Scala اسمه createdAt دون كتابة برنامج فك ترميز يدوي.
import io.circe.generic.extras._
implicit val cfg: Configuration =
Configuration.default.withSnakeCaseMemberNames
@ConfiguredJsonCodec
case class Event(createdAt: String)تجميع الأخطاء
يفشل فك الترميز افتراضيًا عند أول خطأ. أما decodeAccumulating فيجمع جميع الإخفاقات داخل ValidatedNel.
يفيد ذلك في التحقق من النماذج عندما تريد الإبلاغ عن جميع المشكلات دفعة واحدة.
import io.circe.Decoder
val result = Decoder[User]
.decodeAccumulating(json.hcursor)
// Validated[NonEmptyList[DecodingFailure], User]اختيار أسلوب الاشتقاق
استخدم auto للنماذج الأولية السريعة، وsemiauto في شيفرة الإنتاج عندما تريد نسخًا ثابتة وعمليات ترجمة أسرع.
استخدم generic-extras عندما تحتاج إلى إعادة التسمية أو القيم الافتراضية أو المميّزات.
اختبار سريع
اختبر فهمك لفك الترميز إلى فئات case.
مراجعة
يحوّل Decoder[A] JSON إلى قيم ذات أنواع محددة. استخدم generic.auto أو semiauto.deriveDecoder لفئات case التي تتطابق أسماؤها مع المفاتيح.
تُفك المفاتيح المفقودة إلى None في حقول Option؛ وتضيف generic-extras القيم الافتراضية وإعادة التسمية، بينما يجمع decodeAccumulating جميع الأخطاء.
تعلم Scala مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 39
- الدروس
- 143
الأسئلة الشائعة
هل درس «فك الترميز إلى Case Classes» مجاني؟
نعم — نص درس «فك الترميز إلى Case Classes» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.
ماذا ستتعلم في «فك الترميز إلى Case Classes»؟
طابق JSON مع أنواعك تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟
لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «فك الترميز إلى Case Classes»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟
نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تحليل JSON
- فك الترميز إلى Case Classes
- ترميز JSON
- برامج الترميز المخصصة