Özel Kodlayıcılar
Zorlu veri biçimlerini yönetin.
Özel Kodlayıcılar, CoddyKit'te ücretsiz bir Scala for Backend Engineering & Functional Programming dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Scala for Backend Engineering & Functional Programming öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.
Özel Kod Çözücülere Ne Zaman İhtiyaç Duyarsınız
Türetme yaygın durumu kapsar; ancak bazen JSON, case class yapınızı yansıtmaz: eski alan adları, kodlanmış enum'lar veya zaman damgaları gibi biçimler buna örnektir.
Bu durumda bir Decoder, bir Encoder ya da her ikisini elle yazarsınız.
İmleçten Kod Çözücü Oluşturma
Kod çözücü oluşturmanın en açık yolu, bir HCursor alan Decoder.instance kullanmaktır.
Alanlar arasında downField ve as ile ilerleyip bir Either döndürürsünüz.
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)
}forProductN Yardımcıları
Basit eşlemeler için Decoder.forProduct2 daha özlüdür: JSON anahtarlarını listeleyip oluşturucuyu geçirirsiniz.
forProduct1'den başlayarak çok sayıda bağımsız değişkene kadar yardımcılar bulunur.
import io.circe.Decoder
implicit val dec: Decoder[User] =
Decoder.forProduct2("full_name", "years")(User.apply)Elle Kodlayıcı Oluşturma
Kendi alanlarınızdan bir Json nesnesi oluşturarak kod çözücüyü Encoder.instance ile eşleyin.
Ya da tek bir çağrıyla seçtiğiniz JSON anahtarlarına geri eşlemek için Encoder.forProduct2 kullanın.
import io.circe.Encoder
implicit val enc: Encoder[User] =
Encoder.forProduct2("full_name", "years")(u =>
(u.name, u.age))Mevcut Kod Çözücüleri Dönüştürme
Sıfırdan başlamak nadiren gerekir. map, kod çözücünün çıktısını; contramap ise kodlayıcının girdisini uyarlar.
emap, map gibidir ancak başarısız olabilir; doğrulama için Either[String, A] döndürür.
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")
}Enum'lar için Kod Çözücüler
Sealed trait'ler ve case object'ler enum'ları modeller. Her birini bir etiket dizesine kodlayın ve bu dizeyi eşleştirerek yeniden kodunu çözün.
emap, bilinmeyen bir etiketi anlaşılır bir kod çözme hatasına dönüştürür.
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")
}Enum'u Geri Kodlama
Enum kod çözücüsünü, her durumu kendi etiketine dönüştüren bir contramap kodlayıcısıyla eşleştirin.
Böylece sealed trait, JSON içinde düz bir dize olarak iki yönlü dönüşümden geçer.
import io.circe.Encoder
implicit val enc: Encoder[Role] = Encoder[String].contramap {
case Admin => "admin"
case Guest => "guest"
}Tarihler için Özel Codec
Circe'nin çekirdek modülünde yerleşik java.time codec'leri yoktur; bu nedenle tarihler, özel codec kullanımının klasik bir örneğidir.
ISO dizesi biçimi üzerinden kodunu çözün ve kodlayın.
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)Bir Codec İçinde Birleştirme
Her iki yöne de sahip olduğunuzda bunları Codec.from(decoder, encoder) ile tek bir Codec[A] içinde birleştirin.
Bu, iki ayrı örtük değer yerine kapsamda tek bir örtük değer tutulmasını sağlar.
import io.circe.Codec
implicit val roleCodec: Codec[Role] =
Codec.from(dec, enc)ADT'ler için Ayırt Ediciler
Veri içeren sealed hiyerarşilerde circe-generic-extras, sarmalayıcı bir nesne yerine bir ayırt edici alanı ekler.
Bunu bir kez yapılandırıp tüm ADT için codec'leri türetin.
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Örtük Kapsam ve Öncelik
Elle yazılmış örtük bir codec, kapsamda bulunduğu sürece türetmeden önceliklidir. Her zaman bulunabilmesi için onu companion object içine koyun.
Belirsizliği önlemek için aynı tür için hem auto._ içe aktarmaktan hem de elle yazılmış bir örnekten kaçının.
Hızlı Kontrol
Özel codec'ler konusundaki anlayışınızı test edin.
Özet
Özel codec'ler, türlerinizle eşleşmeyen JSON'ları ele alır. Bunları Decoder.instance ve forProductN ile oluşturabilir veya mevcut codec'leri map, contramap ve emap ile dönüştürebilirsiniz.
Enum'lar ve tarihler yaygın örneklerdir; yönleri Codec.from ile birleştirin ve ADT'ler için ayırt edicileri kullanın.
Sıkça Sorulan Sorular
“Özel Kodlayıcılar” dersi ücretsiz mi?
Evet — “Özel Kodlayıcılar” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Scala for Backend Engineering & Functional Programming kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Scala for Backend Engineering & Functional Programming kursu toplamda 4 dersten oluşur.
“Özel Kodlayıcılar” dersinde ne öğreneceğim?
Zorlu veri biçimlerini yönetin. Scala for Backend Engineering & Functional Programming ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Scala for Backend Engineering & Functional Programming öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Scala for Backend Engineering & Functional Programming, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Özel Kodlayıcılar” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Scala for Backend Engineering & Functional Programming dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Scala for Backend Engineering & Functional Programming dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- JSON Ayrıştırma
- Case Class'lara Kod Çözme
- JSON'a Kodlama
- Özel Kodlayıcılar