Scala for Backend Engineering & Functional Programming · Pelajaran

Codec Khusus

Tangani bentuk data yang rumit.

Pelajaran 4 dari 413 langkah

Codec Khusus adalah pelajaran Scala for Backend Engineering & Functional Programming gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Scala for Backend Engineering & Functional Programming, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Kapan Anda Memerlukan Codec Kustom

Derivasi mencakup kasus umum, tetapi terkadang JSON tidak mencerminkan case class Anda: misalnya nama bidang lama, enum yang dienkode, atau format seperti stempel waktu.

Dalam kasus tersebut, Anda menulis Decoder, Encoder, atau keduanya secara manual.

Decoder dari Cursor

Cara paling eksplisit untuk membuat decoder adalah Decoder.instance, yang menerima HCursor.

Anda menelusuri bidang dengan downField dan as, lalu mengembalikan Either.

import io.circe.Decoder

case class User(name: String, age: Int)
implicit val dec: Decoder[User] = Decoder.instance { c =>
  for {
    n <- c.downField("full_name").as[String]
    a <- c.downField("years").as[Int]
  } yield User(n, a)
}

Bantuan forProductN

Untuk pemetaan sederhana, Decoder.forProduct2 lebih ringkas: cantumkan kunci JSON dan teruskan konstruktor.

Bantuan tersedia mulai dari forProduct1 hingga banyak argumen.

import io.circe.Decoder

implicit val dec: Decoder[User] =
  Decoder.forProduct2("full_name", "years")(User.apply)

Encoder secara Manual

Tirukan decoder dengan Encoder.instance, lalu buat objek Json dari bidang-bidang Anda.

Atau gunakan Encoder.forProduct2 untuk memetakan kembali ke kunci JSON yang dipilih dalam satu pemanggilan.

import io.circe.Encoder

implicit val enc: Encoder[User] =
  Encoder.forProduct2("full_name", "years")(u =>
    (u.name, u.age))

Mengubah Codec yang Sudah Ada

Anda jarang memulai dari nol. map menyesuaikan keluaran decoder, sedangkan contramap menyesuaikan masukan encoder.

emap mirip dengan map, tetapi dapat gagal dan mengembalikan Either[String, A] untuk validasi.

import io.circe.Decoder

case class Age(value: Int)
implicit val dec: Decoder[Age] =
  Decoder[Int].emap { i =>
    if (i >= 0) Right(Age(i)) else Left("negative age")
  }

Codec untuk Enum

Sealed trait dengan case object memodelkan enum. Enkode masing-masing menjadi string tag, lalu dekode dengan mencocokkan kembali string tersebut.

emap mengubah tag yang tidak dikenal menjadi kegagalan decoding yang jelas.

sealed trait Role
case object Admin extends Role
case object Guest extends Role

implicit val dec: Decoder[Role] = Decoder[String].emap {
  case "admin" => Right(Admin)
  case "guest" => Right(Guest)
  case other   => Left(s"unknown role: $other")
}

Mengenkode Enum Kembali

Pasangkan decoder enum dengan encoder contramap yang mengubah setiap case menjadi tag-nya.

Sekarang sealed trait dapat melalui proses pulang-pergi sebagai string biasa dalam JSON.

import io.circe.Encoder

implicit val enc: Encoder[Role] = Encoder[String].contramap {
  case Admin => "admin"
  case Guest => "guest"
}

Codec Kustom untuk Tanggal

Circe tidak memiliki codec bawaan java.time dalam modul inti, sehingga tanggal merupakan contoh klasik untuk codec kustom.

Dekode dan enkode melalui format string ISO.

import java.time.LocalDate
import io.circe.{Decoder, Encoder}

implicit val dec: Decoder[LocalDate] =
  Decoder[String].map(LocalDate.parse)
implicit val enc: Encoder[LocalDate] =
  Encoder[String].contramap(_.toString)

Menggabungkan Menjadi Codec

Saat Anda memiliki kedua arah, gabungkan keduanya menjadi satu Codec[A] dengan Codec.from(decoder, encoder).

Dengan demikian, hanya satu implicit yang berada dalam cakupan, bukan dua implicit terpisah.

import io.circe.Codec

implicit val roleCodec: Codec[Role] =
  Codec.from(dec, enc)

Discriminator untuk ADT

Untuk hierarki sealed yang memiliki data, circe-generic-extras menambahkan bidang discriminator, bukan objek pembungkus.

Konfigurasikan sekali, lalu turunkan codec untuk seluruh ADT.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withDiscriminator("type")

@ConfiguredJsonCodec sealed trait Shape
@ConfiguredJsonCodec case class Circle(r: Double) extends Shape

Cakupan dan Prioritas Implicit

Codec implicit yang ditulis secara manual diprioritaskan daripada derivasi selama berada dalam cakupan. Letakkan di companion object agar selalu ditemukan.

Hindari mengimpor auto._ sekaligus instance manual untuk tipe yang sama agar tidak menimbulkan ambiguitas.

Pemeriksaan Singkat

Uji pemahaman Anda tentang codec kustom.

Ringkasan

Codec kustom menangani JSON yang tidak sesuai dengan tipe Anda. Buat dengan Decoder.instance, forProductN, atau ubah codec yang sudah ada melalui map, contramap, dan emap.

Enum dan tanggal merupakan kasus umum; gabungkan kedua arah dengan Codec.from, dan gunakan discriminator untuk ADT.

Gratis untuk memulai

Belajar Scala dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
39
Pelajaran
143

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Codec Khusus” gratis?

Ya — teks lengkap “Codec Khusus” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Scala for Backend Engineering & Functional Programming, upgrade ke CoddyKit PRO. Kursus Scala for Backend Engineering & Functional Programming mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Codec Khusus”?

Tangani bentuk data yang rumit. Kamu berlatih Scala for Backend Engineering & Functional Programming dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Scala for Backend Engineering & Functional Programming?

Tidak diperlukan pengalaman sebelumnya. Scala for Backend Engineering & Functional Programming di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Codec Khusus” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Scala for Backend Engineering & Functional Programming ini?

Ya. Setiap pelajaran Scala for Backend Engineering & Functional Programming menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Mengurai JSON
  2. Mendekode Menjadi Case Class
  3. Menyandikan ke JSON
  4. Codec Khusus
← Kembali ke Scala for Backend Engineering & Functional Programming