Scala voor backend-engineering en functioneel programmeren · Les

Decoderen naar case classes

Koppel JSON aan uw typen.

Les 2 van 413 stappen

Decoderen naar case classes is een gratis Scala voor backend-engineering en functioneel programmeren-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Scala voor backend-engineering en functioneel programmeren. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 4 lessen.

Decoders brengen JSON in kaart naar typen

Een Decoder[A] weet hoe je een Json-waarde leest als een Scala-type A.

Circe levert standaard decoders voor primitieve typen en verzamelingen en kan automatisch decoders voor je eigen case classes bouwen.

Een doel-case class

Stel dat je API gebruikersrecords retourneert. Modelleer de structuur met een case class waarvan de veldnamen overeenkomen met de JSON-sleutels.

Dankzij overeenkomende namen kan Circe zonder handmatige koppeling een decoder afleiden.

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

Automatische afleiding

Importeer io.circe.generic.auto._ en Circe leidt impliciet en op aanvraag een Decoder[User] af waar die nodig is.

Daarna roep je decode[User] aan zonder extra standaardcode.

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

Semi-automatische afleiding

Gebruik voor kortere compileertijden en expliciete controle io.circe.generic.semiauto.deriveDecoder.

Je definieert de decoder één keer, meestal in het companion object, en hergebruikt overal die ene instantie.

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

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

Decodeerfouten

Als een verplicht veld ontbreekt of het verkeerde type heeft, mislukt het decoderen met een DecodingFailure.

De fout bevat een geschiedenis van cursorbewerkingen, waarmee precies wordt aangegeven welk veld het probleem veroorzaakte.

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

Optionele velden in classes

Maak een veld van type Option[A] wanneer de JSON-sleutel kan ontbreken of null kan zijn.

Circe decodeert een ontbrekende sleutel automatisch naar None, dus je hebt alleen voor optionaliteit geen aangepaste decoder nodig.

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

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

Standaardwaarden

Standaardwaarden van case classes kunnen ontbrekende JSON-sleutels invullen, maar alleen wanneer je afleidt met configured derivation waarbij standaardwaarden zijn ingeschakeld.

De module circe-generic-extras biedt dit via Configuration.default.withDefaults.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withDefaults

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

Geneste case classes

Decoderen is compositie: als Circe het type van elk veld kan decoderen, kan het ook een class decoderen die andere case classes bevat.

De afleiding gebeurt automatisch recursief, dus één import volstaat voor diep geneste structuren.

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

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

Velden hernoemen

Wanneer JSON-sleutels afwijken van Scala-namen, bijvoorbeeld snake_case, gebruik je configured derivation met Configuration.default.withSnakeCaseMemberNames.

Hiermee wordt created_at gekoppeld aan het Scala-veld createdAt zonder handgeschreven decoder.

import io.circe.generic.extras._

implicit val cfg: Configuration =
  Configuration.default.withSnakeCaseMemberNames

@ConfiguredJsonCodec
case class Event(createdAt: String)

Fouten verzamelen

Standaard stopt decoderen bij de eerste fout. decodeAccumulating verzamelt daarentegen alle fouten in een ValidatedNel.

Dit is nuttig voor formuliervalidatie waarbij je elk probleem tegelijk wilt melden.

import io.circe.Decoder

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

Een stijl voor afleiding kiezen

Gebruik auto voor snelle prototypes en semiauto voor productiecode waarin je vaste instanties en snellere compilaties wilt.

Gebruik generic-extras wanneer je hernoemen, standaardwaarden of discriminators nodig hebt.

Korte controle

Test of je het decoderen naar case classes begrijpt.

Samenvatting

Een Decoder[A] zet JSON om in waarden met een type. Gebruik generic.auto of semiauto.deriveDecoder voor case classes waarvan de namen overeenkomen met de sleutels.

Ontbrekende sleutels worden bij velden van type Option gedecodeerd naar None; generic-extras voegt standaardwaarden en hernoemen toe; decodeAccumulating verzamelt alle fouten.

Gratis beginnen

Leer Scala met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
39
Lessen
143

Veelgestelde vragen

Is de les “Decoderen naar case classes” gratis?

Ja — de volledige tekst van “Decoderen naar case classes” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Scala voor backend-engineering en functioneel programmeren wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Scala voor backend-engineering en functioneel programmeren bevat in totaal 4 lessen.

Wat leer ik in “Decoderen naar case classes”?

Koppel JSON aan uw typen. Je oefent met Scala voor backend-engineering en functioneel programmeren door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Scala voor backend-engineering en functioneel programmeren te beginnen?

Ervaring vooraf is niet nodig. Scala voor backend-engineering en functioneel programmeren op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Decoderen naar case classes”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Scala voor backend-engineering en functioneel programmeren?

Ja. Elke les over Scala voor backend-engineering en functioneel programmeren bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. JSON parsen
  2. Decoderen naar case classes
  3. Coderen naar JSON
  4. Aangepaste codecs
← Terug naar Scala voor backend-engineering en functioneel programmeren