Dekod til case classes
Map JSON til Deres typer.
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.
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
- Pars JSON
- Dekod til case classes
- Kod til JSON
- Tilpassede codecs