0Pricing
Scala for Backend Engineering & Functional Programming · Lezione

Analizzare JSON

Trasformi il testo in valori JSON.

Analizzare JSON è una lezione Scala for Backend Engineering & Functional Programming gratuita su CoddyKit. Questa è la lezione 1 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.

Perché Circe?

Circe è una popolare libreria JSON per Scala, basata sull'ecosistema funzionale cats.

Privilegia la sicurezza dei tipi e l'immutabilità: il parsing restituisce un Either invece di generare eccezioni e la decodifica produce valori tipizzati anziché mappe non tipizzate.

Questa lezione illustra come trasformare testo JSON grezzo nel modello Json di Circe.

Aggiungere la dipendenza

Circe è distribuito in diversi moduli. Per il parsing e il modello di base servono circe-core e circe-parser.

Il modulo circe-generic aggiunge la derivazione automatica dei codec, che verrà trattata nelle lezioni successive.

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core" % "0.14.6",
  "io.circe" %% "circe-parser" % "0.14.6"
)

La funzione parse

Il punto di ingresso per leggere JSON è io.circe.parser.parse.

Accetta una String e restituisce Either[ParsingFailure, Json]. Il lato sinistro contiene gli errori di sintassi; quello destro contiene l'albero analizzato.

import io.circe.parser._

val result = parse("{\"name\": \"Ada\", \"age\": 36}")
// result: Either[ParsingFailure, Json]

Gestire gli errori di parsing

Poiché parse restituisce un Either, gli errori vengono gestiti esplicitamente con il pattern matching o con i combinatori, invece di usare try/catch.

Un ParsingFailure include un messaggio comprensibile che descrive il problema di sintassi.

parse("{ not valid }") match {
  case Right(json) => println(json)
  case Left(err)   => println(s"Failed: ${err.message}")
}

Il modello Json

Un valore analizzato correttamente è un Json, cioè un albero immutabile che rappresenta uno dei sei tipi JSON: oggetto, array, stringa, numero, booleano o null.

È possibile esaminarlo con predicati come isObject oppure applicare un fold alla sua struttura.

val json = parse("[1, 2, 3]").getOrElse(Json.Null)
println(json.isArray)   // true
println(json.isObject)  // false

Navigare con il cursore

Per accedere ai dati annidati, chiami .hcursor su un valore Json. HCursor è uno zipper che consente di spostarsi nell'albero.

Utilizzi downField per scendere fino a una chiave di un oggetto.

val json = parse("{\"user\": {\"name\": \"Ada\"}}").toOption.get
val cursor = json.hcursor
val name = cursor.downField("user").downField("name").as[String]
// name: Either[DecodingFailure, String] = Right(Ada)

Estrarre valori con as

Una volta posizionati, .as[A] tenta di decodificare il valore corrente nel tipo A.

Restituisce Either[DecodingFailure, A], quindi una mancata corrispondenza di tipo viene segnalata come valore, non come eccezione.

val json = parse("{\"age\": 36}").toOption.get
val age = json.hcursor.downField("age").as[Int]
println(age)  // Right(36)

parse e decode

Utilizzi parse quando desidera esaminare manualmente l'albero Json grezzo.

Utilizzi decode[A] quando desidera passare direttamente da String a un valore tipizzato A in un solo passaggio. Combina parsing e decodifica.

import io.circe.parser.decode

val n: Either[io.circe.Error, Int] =
  decode[Int]("42")
println(n)  // Right(42)

Campi facoltativi

Il JSON del mondo reale contiene spesso chiavi mancanti. Il metodo del cursore get[A] applicato a un campo raggiunto fallisce se questo è assente, mentre getOrElse fornisce un valore predefinito.

La decodifica in Option[A] tratta un campo mancante o nullo come None.

val json = parse("{\"name\": \"Ada\"}").toOption.get
val nick = json.hcursor.get[Option[String]]("nickname")
println(nick)  // Right(None)

Analizzare gli array

È possibile decodificare direttamente un array JSON in una raccolta Scala richiedendo List[A] o Vector[A].

Circe mappa ogni elemento e interrompe l'operazione restituendo un DecodingFailure se un elemento ha il tipo errato.

import io.circe.parser.decode

val xs = decode[List[Int]]("[1, 2, 3]")
println(xs)  // Right(List(1, 2, 3))

Formattazione leggibile

Qualsiasi valore Json può essere riconvertito in testo con .noSpaces per un output compatto oppure con .spaces2 per un output indentato.

Questo consente di effettuare il round-trip dei dati analizzati ed è utile per il logging o il debugging.

val json = parse("{\"a\":1,\"b\":2}").toOption.get
println(json.noSpaces)
println(json.spaces2)

Verifica rapida

Verifichi la propria comprensione del parsing con Circe.

Riepilogo

Ha imparato a trasformare il testo JSON nel modello di Circe. parse restituisce Either[ParsingFailure, Json]; decode[A] passa direttamente a un valore tipizzato.

HCursor consente di navigare con downField, mentre .as[A] estrae valori tipizzati. Gli errori sono valori, non eccezioni.

Domande Frequenti

La lezione «Analizzare JSON» è gratuita?

Sì — il testo completo di «Analizzare JSON» è 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 «Analizzare JSON»?

Trasformi il testo in valori JSON. 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 1 di 4.

Quanto tempo richiede la lezione «Analizzare JSON»?

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

  1. Analizzare JSON
  2. Decodificare in case class
  3. Codificare in JSON
  4. Codec personalizzati
← Torna a Scala for Backend Engineering & Functional Programming