Scala for backendutvikling og funksjonell programmering · leksjon

Dekod til case-klasser

Tilknytt JSON til typene Deres.

Leksjon 2 av 413 trinn

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.

Gratis å komme i gang

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

  1. Analyser JSON
  2. Dekod til case-klasser
  3. Kod til JSON
  4. Tilpassede codec-er
← Tilbake til Scala for backendutvikling og funksjonell programmering