Dekodowanie do case class
Odwzoruje Pan/Pani JSON na własne typy.
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.
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
- Parsowanie JSON
- Dekodowanie do case class
- Kodowanie do JSON
- Własne kodeki