Scala for Backend Engineering & Functional Programming · Lekcja

Dekodowanie do case class

Odwzoruje Pan/Pani JSON na własne typy.

Lekcja 2 z 413 kroki

Dekodowanie do case class to bezpłatna lekcja Scala for Backend Engineering & Functional Programming na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Scala for Backend Engineering & Functional Programming, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Dekodery mapują JSON na typy

Element Decoder[A] wie, jak odczytać wartość Json do typu Scali A.

Circe od razu udostępnia dekodery dla typów prostych i kolekcji, a także potrafi automatycznie tworzyć dekodery dla własnych klas przypadków.

Docelowa klasa przypadku

Załóżmy, że API zwraca rekordy użytkowników. Zamodeluj ich strukturę za pomocą klasy przypadku, której nazwy pól odpowiadają kluczom JSON.

Zgodność nazw pozwala Circe wyprowadzić dekoder bez ręcznego łączenia elementów.

case class User(name: String, age: Int, admin: Boolean)

Automatyczne wyprowadzanie

Zaimportuj io.circe.generic.auto._, a Circe niejawnie wyprowadzi Decoder[User] na żądanie, wszędzie tam, gdzie będzie potrzebny.

Następnie wywołujesz decode[User] bez dodatkowego kodu pomocniczego.

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))

Półautomatyczne wyprowadzanie

Aby uzyskać krótszy czas kompilacji i jawną kontrolę, użyj io.circe.generic.semiauto.deriveDecoder.

Zdefiniuj dekoder raz, zwykle w obiekcie towarzyszącym, i używaj tej jednej instancji w całej aplikacji.

import io.circe.Decoder
import io.circe.generic.semiauto._

object User {
  implicit val dec: Decoder[User] = deriveDecoder[User]
}

Błędy dekodowania

Jeśli brakuje wymaganego pola lub ma ono nieprawidłowy typ, dekodowanie kończy się błędem DecodingFailure.

Błąd zawiera history operacji kursora, dokładnie wskazując pole, które spowodowało problem.

val bad = decode[User]("{\"name\":\"Ada\"}")
println(bad)
// Left(DecodingFailure at .age: Missing required field)

Pola opcjonalne w klasach

Użyj pola typu Option[A], gdy klucz JSON może nie występować lub może mieć wartość null.

Circe automatycznie dekoduje brakujący klucz do None, więc sama opcjonalność nie wymaga niestandardowego dekodera.

case class Account(id: Long, nickname: Option[String])

val a = decode[Account]("{\"id\":7}")
println(a)  // Right(Account(7,None))

Wartości domyślne

Domyślne wartości klas przypadków mogą uzupełniać brakujące klucze JSON, ale tylko wtedy, gdy używasz wyprowadzania z konfiguracją configured, które włącza wartości domyślne.

Moduł circe-generic-extras udostępnia tę funkcję za pomocą Configuration.default.withDefaults.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withDefaults

@ConfiguredJsonCodec
case class Settings(theme: String = "dark")

Zagnieżdżone klasy przypadków

Dekodowanie jest kompozycyjne: jeśli Circe potrafi zdekodować typ każdego pola, potrafi również zdekodować klasę zawierającą inne klasy przypadków.

Wyprowadzanie odbywa się automatycznie rekurencyjnie, więc jeden import obsługuje głęboko zagnieżdżone struktury.

case class Address(city: String)
case class Person(name: String, address: Address)

val p = decode[Person](
  "{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}}")
println(p)

Zmiana nazw pól

Gdy klucze JSON różnią się od nazw w Scali (na przykład używają snake_case), użyj wyprowadzania z konfiguracją Configuration.default.withSnakeCaseMemberNames.

Mapuje ono created_at na pole Scali createdAt bez ręcznie napisanego dekodera.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withSnakeCaseMemberNames

@ConfiguredJsonCodec
case class Event(createdAt: String)

Zbieranie błędów

Domyślnie dekodowanie kończy się przy pierwszym błędzie. decodeAccumulating zamiast tego zbiera wszystkie błędy do elementu ValidatedNel.

Jest to przydatne podczas walidacji formularzy, gdy chcesz od razu zgłosić wszystkie problemy.

import io.circe.Decoder

val result = Decoder[User]
  .decodeAccumulating(json.hcursor)
// Validated[NonEmptyList[DecodingFailure], User]

Wybór stylu wyprowadzania

Użyj auto w szybkich prototypach, a semiauto w kodzie produkcyjnym, gdy chcesz mieć stałe instancje i krótszy czas kompilacji.

Sięgnij po generic-extras, gdy potrzebujesz zmiany nazw, wartości domyślnych lub dyskryminatorów.

Szybki test

Sprawdź, czy rozumiesz dekodowanie do klas przypadków.

Podsumowanie

Element Decoder[A] zamienia JSON na typowane wartości. Użyj generic.auto lub semiauto.deriveDecoder dla klas przypadków, których nazwy odpowiadają kluczom.

Brakujące klucze są dekodowane do None dla pól typu Option; generic-extras dodaje wartości domyślne i zmianę nazw, a decodeAccumulating zbiera wszystkie błędy.

Bezpłatny start

Ucz się Scala dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
39
Lekcje
143

Często zadawane pytania

Czy lekcja „Dekodowanie do case class” jest bezpłatna?

Tak — pełny tekst „Dekodowanie do case class” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Scala for Backend Engineering & Functional Programming, przejdź na CoddyKit PRO. Kurs Scala for Backend Engineering & Functional Programming zawiera 4 lekcji w sumie.

Co nauczysz się w „Dekodowanie do case class”?

Odwzoruje Pan/Pani JSON na własne typy. Ćwiczysz Scala for Backend Engineering & Functional Programming z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Scala for Backend Engineering & Functional Programming?

Nie wymagamy żadnego doświadczenia. Scala for Backend Engineering & Functional Programming w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Dekodowanie do case class”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Scala for Backend Engineering & Functional Programming?

Tak. Każda lekcja Scala for Backend Engineering & Functional Programming zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Parsowanie JSON
  2. Dekodowanie do case class
  3. Kodowanie do JSON
  4. Własne kodeki
← Powrót do Scala for Backend Engineering & Functional Programming