Dekod til case-klasser
Tilknytt JSON til typene Deres.
Dekod til case-klasser er en gratis leksjon i Scala for backendutvikling og funksjonell programmering på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Scala for backendutvikling og funksjonell programmering, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Scala for backendutvikling og funksjonell programmering inneholder totalt 4 leksjoner.
Dekodere mapper JSON til typer
En Decoder[A] vet hvordan en Json-verdi skal leses inn i en Scala-type A.
Circe tilbyr dekodere for primitive typer og samlinger som standard, og kan automatisk bygge dekodere for dine egne case-klasser.
En mål-case-klasse
Anta at API-et ditt returnerer brukeroppføringer. Modeller strukturen med en case-klasse der feltnavnene samsvarer med JSON-nøklene.
Det er samsvaret mellom navnene som gjør at Circe kan utlede en dekoder uten manuell kobling.
case class User(name: String, age: Int, admin: Boolean)Automatisk utledning
Importer io.circe.generic.auto._, så utleder Circe implisitt en Decoder[User] ved behov, uansett hvor den trengs.
Deretter kaller du decode[User] uten 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))Halvautomatisk utledning
For bedre kompileringstider og eksplisitt kontroll bruker du io.circe.generic.semiauto.deriveDecoder.
Du definerer dekoderen én gang, vanligvis i companion-objektet, og bruker den samme instansen overalt.
import io.circe.Decoder
import io.circe.generic.semiauto._
object User {
implicit val dec: Decoder[User] = deriveDecoder[User]
}Dekodingsfeil
Hvis et obligatorisk felt mangler eller har feil type, mislykkes dekodingen med en DecodingFailure.
Feilen inneholder en historikk over markøroperasjoner, slik at du nøyaktig kan se hvilket felt som forårsaket problemet.
val bad = decode[User]("{\"name\":\"Ada\"}")
println(bad)
// Left(DecodingFailure at .age: Missing required field)Valgfrie felt i klasser
Gjør et felt til Option[A] når JSON-nøkkelen kan mangle eller ha verdien null.
Circe dekoder automatisk en manglende nøkkel til None, så du trenger ingen egendefinert dekoder bare for å støtte valgfrihet.
case class Account(id: Long, nickname: Option[String])
val a = decode[Account]("{\"id\":7}")
println(a) // Right(Account(7,None))Standardverdier
Standardverdier i case-klasser kan fylle inn manglende JSON-nøkler, men bare når du bruker konfigurert utledning som har aktivert standardverdier.
Modulen circe-generic-extras tilbyr dette gjennom Configuration.default.withDefaults.
import io.circe.generic.extras._
implicit val cfg: Configuration =
Configuration.default.withDefaults
@ConfiguredJsonCodec
case class Settings(theme: String = "dark")Nestede case-klasser
Dekoding kan settes sammen: Hvis Circe kan dekode typen til hvert felt, kan den også dekode en klasse som inneholder andre case-klasser.
Utledningen går automatisk rekursivt, slik at én import håndterer dypt nestede strukturer.
case class Address(city: String)
case class Person(name: String, address: Address)
val p = decode[Person](
"{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}}")
println(p)Gi felter nye navn
Når JSON-nøkler skiller seg fra Scala-navnene, for eksempel ved å bruke snake_case, bruker du konfigurert utledning med Configuration.default.withSnakeCaseMemberNames.
Dette mapper created_at til Scala-feltet createdAt uten en håndskrevet dekoder.
import io.circe.generic.extras._
implicit val cfg: Configuration =
Configuration.default.withSnakeCaseMemberNames
@ConfiguredJsonCodec
case class Event(createdAt: String)Samle feil
Som standard stopper dekodingen ved den første feilen. decodeAccumulating samler i stedet alle feil i en ValidatedNel.
Dette er nyttig ved skjemavalidering når du vil rapportere alle problemene samtidig.
import io.circe.Decoder
val result = Decoder[User]
.decodeAccumulating(json.hcursor)
// Validated[NonEmptyList[DecodingFailure], User]Velge utledningsstil
Bruk auto for raske prototyper og semiauto i produksjonskode når du ønsker faste instanser og raskere kompilering.
Velg generic-extras når du trenger nye navn, standardverdier eller diskriminatorer.
Kunnskapssjekk
Test forståelsen din av dekoding til case-klasser.
Oppsummering
En Decoder[A] gjør JSON om til typede verdier. Bruk generic.auto eller semiauto.deriveDecoder for case-klasser der navnene samsvarer med nøklene.
Manglende nøkler dekoder felt av typen Option til None; generic-extras legger til standardverdier og nye navn; decodeAccumulating samler alle feil.
Lær deg Scala med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 39
- Leksjoner
- 143
Ofte stilte spørsmål
Er leksjonen «Dekod til case-klasser» gratis?
Ja – hele teksten i «Dekod til case-klasser» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Scala for backendutvikling og funksjonell programmering-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Scala for backendutvikling og funksjonell programmering inneholder totalt 4 leksjoner.
Hva lærer jeg i «Dekod til case-klasser»?
Tilknytt JSON til typene Deres. Du øver på Scala for backendutvikling og funksjonell programmering med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Scala for backendutvikling og funksjonell programmering?
Ingen tidligere erfaring er nødvendig. Scala for backendutvikling og funksjonell programmering på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Dekod til case-klasser»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Scala for backendutvikling og funksjonell programmering-leksjonen?
Ja. Alle Scala for backendutvikling og funksjonell programmering-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Analyser JSON
- Dekod til case-klasser
- Kod til JSON
- Tilpassede codec-er