Scala til backendudvikling og funktionel programmering · Lektion

Dekod til case classes

Map JSON til Deres typer.

Lektion 2 af 413 trin

Dekod til case classes er en gratis Scala til backendudvikling og funktionel programmering-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Scala til backendudvikling og funktionel programmering, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.

Afkodere mapper JSON til typer

En Decoder[A] ved, hvordan en Json-værdi læses ind i en Scala-type A.

Circe leverer afkodere til primitive typer og samlinger fra starten og kan automatisk opbygge afkodere til dine egne case classes.

En mål-case class

Antag, at din API returnerer brugerposter. Modellér strukturen med en case class, hvis feltnavne matcher JSON-nøglerne.

Matchende navne gør det muligt for Circe at udlede en afkoder uden manuel kobling.

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

Automatisk afledning

Importér io.circe.generic.auto._, så udleder Circe implicit en Decoder[User] efter behov, overalt hvor der er brug for en.

Derefter kalder du decode[User] uden ekstra standardkode.

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

Semiautomatisk afledning

Brug io.circe.generic.semiauto.deriveDecoder for hurtigere kompilering og eksplicit kontrol.

Du definerer afkoderen én gang, normalt i companion object, og genbruger den samme instans overalt.

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

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

Afkodningsfejl

Hvis et påkrævet felt mangler eller har den forkerte type, mislykkes afkodningen med en DecodingFailure.

Fejlen indeholder en historik over markøroperationer, som præcist angiver, hvilket felt der forårsagede problemet.

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

Valgfrie felter i klasser

Gør et felt til Option[A], når JSON-nøglen kan mangle eller have værdien null.

Circe afkoder automatisk en manglende nøgle til None, så du behøver ikke en brugerdefineret afkoder kun for at understøtte valgfrihed.

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

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

Standardværdier

Standardværdier i case classes kan udfylde manglende JSON-nøgler, men kun når du udleder med en configured-afledning, der aktiverer standardværdier.

Modulet circe-generic-extras leverer dette via Configuration.default.withDefaults.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withDefaults

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

Indlejrede case classes

Afkodning kan sammensættes: Hvis Circe kan afkode typen for hvert felt, kan den også afkode en klasse, der indeholder andre case classes.

Afledningen gentager sig automatisk, så én import håndterer dybt indlejrede strukturer.

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

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

Omdøbning af felter

Når JSON-nøgler afviger fra Scala-navne (for eksempel snake_case), skal du bruge konfigureret afledning med Configuration.default.withSnakeCaseMemberNames.

Det mapper created_at til Scala-feltet createdAt uden en håndskrevet afkoder.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withSnakeCaseMemberNames

@ConfiguredJsonCodec
case class Event(createdAt: String)

Opsamling af fejl

Som standard stopper afkodningen ved den første fejl. decodeAccumulating samler i stedet alle fejl i en ValidatedNel.

Det er nyttigt til formularvalidering, hvor du vil rapportere alle problemer på én gang.

import io.circe.Decoder

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

Valg af afledningsstil

Brug auto til hurtige prototyper og semiauto i produktionskode, hvor du ønsker faste instanser og hurtigere kompilering.

Vælg generic-extras, når du har brug for omdøbning, standardværdier eller diskriminatorer.

Hurtigt tjek

Test din forståelse af afkodning til case classes.

Opsummering

En Decoder[A] omdanner JSON til typede værdier. Brug generic.auto eller semiauto.deriveDecoder til case classes, hvis navne matcher nøglerne.

Manglende nøgler afkoder felter af typen Option til None; generic-extras tilføjer standardværdier og omdøbning; decodeAccumulating samler alle fejl.

Gratis at komme i gang

Lær Scala med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
39
Lektioner
143

Ofte stillede spørgsmål

Er lektionen “Dekod til case classes” gratis?

Ja — hele teksten til “Dekod til case classes” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Scala til backendudvikling og funktionel programmering-kurset, skal du opgradere til CoddyKit PRO. Scala til backendudvikling og funktionel programmering-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Dekod til case classes”?

Map JSON til Deres typer. Du øver dig i Scala til backendudvikling og funktionel programmering med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Scala til backendudvikling og funktionel programmering?

Der kræves ingen tidligere erfaring. Scala til backendudvikling og funktionel programmering på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Dekod til case classes”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Scala til backendudvikling og funktionel programmering-lektion?

Ja. Alle Scala til backendudvikling og funktionel programmering-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Pars JSON
  2. Dekod til case classes
  3. Kod til JSON
  4. Tilpassede codecs
← Tilbage til Scala til backendudvikling og funktionel programmering