Decodificare in case class
Mappi JSON sui Suoi tipi.
Decodificare in case class è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Scala for Backend Engineering & Functional Programming, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
I decoder associano il JSON ai tipi
Un Decoder[A] sa leggere un valore Json trasformandolo in un tipo Scala A.
Circe fornisce decoder per i tipi primitivi e le raccolte, e può creare automaticamente decoder per le proprie case class.
Una case class di destinazione
Supponga che la propria API restituisca record di utenti. Ne modelli la struttura con una case class i cui nomi dei campi corrispondano alle chiavi JSON.
La corrispondenza dei nomi consente a Circe di derivare un decoder senza configurazione manuale.
case class User(name: String, age: Int, admin: Boolean)Derivazione automatica
Importi io.circe.generic.auto._: Circe deriverà implicitamente un Decoder[User] quando e dove sarà necessario.
Potrà quindi chiamare decode[User] senza codice aggiuntivo.
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))Derivazione semi-automatica
Per ottenere tempi di compilazione migliori e un controllo esplicito, utilizzi io.circe.generic.semiauto.deriveDecoder.
Definisca il decoder una volta, di solito nell'oggetto companion, e riutilizzi la stessa istanza ovunque.
import io.circe.Decoder
import io.circe.generic.semiauto._
object User {
implicit val dec: Decoder[User] = deriveDecoder[User]
}Errori di decodifica
Se manca un campo obbligatorio o il suo tipo è errato, la decodifica fallisce con un DecodingFailure.
L'errore contiene una history delle operazioni del cursore, indicando con precisione quale campo ha causato il problema.
val bad = decode[User]("{\"name\":\"Ada\"}")
println(bad)
// Left(DecodingFailure at .age: Missing required field)Campi facoltativi nelle classi
Renda un campo di tipo Option[A] quando la chiave JSON può essere assente o nulla.
Circe decodifica automaticamente una chiave mancante in None, quindi non serve un decoder personalizzato solo per gestire l'opzionalità.
case class Account(id: Long, nickname: Option[String])
val a = decode[Account]("{\"id\":7}")
println(a) // Right(Account(7,None))Valori predefiniti
I valori predefiniti delle case class possono riempire le chiavi JSON mancanti, ma solo se si utilizza la derivazione configured con i valori predefiniti abilitati.
Il modulo circe-generic-extras offre questa funzionalità tramite Configuration.default.withDefaults.
import io.circe.generic.extras._
implicit val cfg: Configuration =
Configuration.default.withDefaults
@ConfiguredJsonCodec
case class Settings(theme: String = "dark")Case class annidate
La decodifica è componibile: se Circe sa decodificare il tipo di ogni campo, sa decodificare anche una classe che annida altre case class.
La derivazione procede automaticamente in profondità, quindi una sola importazione gestisce strutture profondamente annidate.
case class Address(city: String)
case class Person(name: String, address: Address)
val p = decode[Person](
"{\"name\":\"Ada\",\"address\":{\"city\":\"London\"}}")
println(p)Rinominare i campi
Quando le chiavi JSON differiscono dai nomi Scala, ad esempio usando snake_case, utilizzi la derivazione configurata con Configuration.default.withSnakeCaseMemberNames.
In questo modo created_at viene associato al campo Scala createdAt senza scrivere un decoder manuale.
import io.circe.generic.extras._
implicit val cfg: Configuration =
Configuration.default.withSnakeCaseMemberNames
@ConfiguredJsonCodec
case class Event(createdAt: String)Raccogliere gli errori
Per impostazione predefinita, la decodifica si interrompe al primo errore. decodeAccumulating, invece, raccoglie tutti gli errori in un ValidatedNel.
È utile per la convalida dei moduli, quando desidera segnalare tutti i problemi contemporaneamente.
import io.circe.Decoder
val result = Decoder[User]
.decodeAccumulating(json.hcursor)
// Validated[NonEmptyList[DecodingFailure], User]Scegliere lo stile di derivazione
Utilizzi auto per i prototipi rapidi e semiauto nel codice di produzione, quando desidera istanze fisse e compilazioni più rapide.
Scelga generic-extras quando servono rinomina, valori predefiniti o discriminatori.
Verifica rapida
Verifichi la propria comprensione della decodifica nelle case class.
Riepilogo
Un Decoder[A] trasforma il JSON in valori tipizzati. Utilizzi generic.auto o semiauto.deriveDecoder per le case class i cui nomi corrispondono alle chiavi.
Le chiavi mancanti decodificano i campi Option in None; generic-extras aggiunge valori predefiniti e rinomina; decodeAccumulating raccoglie tutti gli errori.
Domande Frequenti
La lezione «Decodificare in case class» è gratuita?
Sì — il testo completo di «Decodificare in case class» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Scala for Backend Engineering & Functional Programming, passa a CoddyKit PRO. Il corso Scala for Backend Engineering & Functional Programming include 4 lezioni in totale.
Cosa imparerò in «Decodificare in case class»?
Mappi JSON sui Suoi tipi. Eserciti Scala for Backend Engineering & Functional Programming con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Scala for Backend Engineering & Functional Programming?
Non è richiesta alcuna esperienza precedente. Scala for Backend Engineering & Functional Programming su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Decodificare in case class»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Scala for Backend Engineering & Functional Programming?
Sì. Ogni lezione Scala for Backend Engineering & Functional Programming include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Analizzare JSON
- Decodificare in case class
- Codificare in JSON
- Codec personalizzati