0Pricing
Scala for Backend Engineering & Functional Programming · درس

ترميز JSON

حوّل بياناتك إلى صيغة متسلسلة

ترميز JSON درس مجاني في Scala for Backend Engineering & Functional Programming على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Scala for Backend Engineering & Functional Programming، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

تنتج Encoders كائنات JSON

إن Encoder[A] هو النظير العكسي لـ decoder؛ إذ يحوّل قيمة Scala من النوع A إلى شجرة Json في Circe.

بعد ذلك، تسلسلها إلى String لاستخدامها في استجابات HTTP أو السجلات أو التخزين.

صياغة asJson

استورد io.circe.syntax._ للحصول على طريقة الامتداد .asJson على أي قيمة يتوفر لها Encoder في النطاق.

تعمل الأنواع البدائية والمجموعات مباشرةً.

import io.circe.syntax._

println(42.asJson.noSpaces)        // 42
println("hi".asJson.noSpaces)      // "hi"
println(List(1,2,3).asJson.noSpaces)  // [1,2,3]

اشتقاق Encoders

مثل برامج فك الترميز، تُشتق برامج الترميز لفئات case. استورد io.circe.generic.auto._ للاشتقاق التلقائي.

تصبح أسماء الحقول مفاتيح JSON، وتُرمّز قيم الحقول تكراريًا.

import io.circe.generic.auto._
import io.circe.syntax._

case class User(name: String, age: Int)
println(User("Ada", 36).asJson.noSpaces)
// {"name":"Ada","age":36}

برامج الترميز شبه التلقائية

للحصول على نسخ صريحة قابلة لإعادة الاستخدام، استخدم deriveEncoder من io.circe.generic.semiauto.

يؤدي وضعه في الكائن المرافق إلى توفير Encoder[User] مشترك واحد عبر قاعدة الشيفرة.

import io.circe.Encoder
import io.circe.generic.semiauto._

object User {
  implicit val enc: Encoder[User] = deriveEncoder[User]
}

إنشاء Json يدويًا

يمكنك إنشاء JSON مباشرةً باستخدام Json.obj وأزواج المفتاح والقيمة، على أن تستخدم القيم .asJson.

يفيد ذلك في البنى السريعة التي لا تقابل فئة case.

import io.circe.Json
import io.circe.syntax._

val j = Json.obj(
  "ok" -> true.asJson,
  "count" -> 3.asJson
)
println(j.noSpaces)  // {"ok":true,"count":3}

خيارات الترميز

يُرمّز حقل Option[A] الذي يحتوي على Some(x) كالقيمة نفسها، بينما يُرمّز None كـ JSON null افتراضيًا.

إذا كنت تفضّل حذف مفاتيح null تمامًا، فيمكنك حذفها بعد الترميز، كما سيأتي لاحقًا.

case class Account(id: Long, nick: Option[String])
println(Account(7, None).asJson.noSpaces)
// {"id":7,"nick":null}

حذف القيم الفارغة

لحذف قيم null، حوّل قيمة Json الناتجة باستخدام .deepDropNullValues.

يزيل ذلك تكراريًا المفاتيح التي تكون قيمتها null، وينتج مخرجات أنظف للحقول الاختيارية.

val clean = Account(7, None).asJson.deepDropNullValues
println(clean.noSpaces)
// {"id":7}

تنسيق المخرجات بشكل جميل

استخدم .spaces2 أو .spaces4 للحصول على JSON مُنسّق وسهل القراءة، واستخدم .noSpaces لتنسيق النقل المضغوط.

وللتحكم الكامل في التنسيق، أنشئ Printer مخصصًا.

import io.circe.Printer

val printer = Printer.spaces2.copy(dropNullValues = true)
println(printer.print(Account(7, None).asJson))

ترميز الخرائط

يُرمَّز Map[String, A] إلى كائن JSON، حيث تصبح مفاتيح الخريطة مفاتيح JSON.

أما أنواع المفاتيح غير النصية، فيجب أن توفر لها KeyEncoder يعرض المفتاح كنص.

import io.circe.syntax._

val scores = Map("ada" -> 90, "alan" -> 85)
println(scores.asJson.noSpaces)
// {"ada":90,"alan":85}

إجراء التحويلات على أدوات الترميز

يمكنك تكييف أداة ترميز موجودة باستخدام contramap، وذلك بتوفير دالة تحول نوعك إلى نوع يدعمه Circe بالترميز مسبقًا.

وهذا يجنبك كتابة أداة ترميز كاملة من الصفر.

import io.circe.Encoder

case class UserId(value: Long)
implicit val enc: Encoder[UserId] =
  Encoder[Long].contramap(_.value)

الترميز وفك الترميز معًا

عندما تحتاج إلى الاتجاهين معًا، اشتق Codec[A] واحدة باستخدام deriveCodec، فهي تجمع أداة الترميز وأداة فك الترميز.

وبذلك يظل الاثنان متزامنين مع تطور الصنف ذي الحالات.

import io.circe.Codec
import io.circe.generic.semiauto._

implicit val codec: Codec[User] = deriveCodec[User]

تحقق سريع

اختبر مدى فهمك للترميز إلى JSON.

مراجعة

تحوّل Encoder[A] قيم Scala إلى Json. استخدم .asJson مع أدوات الترميز المشتقة، أو أنشئ أشجارًا باستخدام Json.obj.

تتحول None إلى null ما لم تحذفها؛ ويعيد contramap استخدام أدوات الترميز؛ بينما يجمع deriveCodec الاتجاهين.

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

هل درس «ترميز JSON» مجاني؟

نعم — نص درس «ترميز JSON» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Scala for Backend Engineering & Functional Programming، انتقل إلى CoddyKit PRO. تتضمن دورة Scala for Backend Engineering & Functional Programming 4 دروس في المجموع.

ماذا ستتعلم في «ترميز JSON»؟

حوّل بياناتك إلى صيغة متسلسلة تتمرن على Scala for Backend Engineering & Functional Programming مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Scala for Backend Engineering & Functional Programming؟

لا تُشترط خبرة سابقة. Scala for Backend Engineering & Functional Programming على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «ترميز JSON»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Scala for Backend Engineering & Functional Programming هذا؟

نعم. كل درس في Scala for Backend Engineering & Functional Programming يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تحليل JSON
  2. فك الترميز إلى Case Classes
  3. ترميز JSON
  4. برامج الترميز المخصصة
← العودة إلى Scala for Backend Engineering & Functional Programming