100 % locale — i tuoi dati non lasciano mai il tuo browser

JSON in Scala — case class con le chiavi intatte

Trasforma un campione JSON in case class Scala. I campi mantengono le chiavi JSON, tra backtick dove serve, pronti per il tuo codec.

Istantaneo Privato Zero cookie

Input JSON

Output Scala

Che cosa fa questo strumento

Un campione JSON diventa case class Scala, una per oggetto.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
case class Root(
  id: Long,
  firstName: String,
  address: Address
)

case class Address(
  city: String
)

Anche un array di oggetti alla radice prende un nome: type Root = List[RootItem], un alias di primo livello, quindi Scala 3.

I backtick tengono la chiave

{ "content-type": "text/html", "class": 1 }
case class Root(
  `content-type`: String,
  `class`: Long
)

Scala prende per identificatore tutto ciò che sta tra backtick: il nome del campo può restare esattamente quello che diceva il JSON. Non è una scelta estetica: circe, zio-json e upickle ricavano tutti il nome JSON dal nome del campo, così questa case class legge il tuo carico com’è, senza annotazioni e senza decoder su misura.

L’altra via — rinominare in contentType — richiederebbe un codec configurato per rilegarlo, e un campione non può dire quale libreria usi.

I tipi, e i due che ammettono la propria ignoranza

Gli interi diventano Long e i decimali Double: un numero JSON non sta in modo affidabile né in un Int né in un Float, e allargare vale più di un traboccamento silenzioso.

null, un array vuoto e un array misto diventano tutti Any, esattamente tanto vago quanto il campione. Any è scomodo in Scala, e quel disagio è il punto: segna i campi su cui il documento non ha detto nulla, e non finge il contrario.

Ciò che un campione non può dire

Nessun campo è un Option, nessuno ha un valore predefinito e nulla è un sealed trait: un documento mostra una forma. Se due carichi differiscono per una chiave, quella è un’unione che modelli tu — e il punto in cui un tipo generato smette di servire e comincia il tuo progetto.

Privato per progettazione

Tutto viene eseguito localmente nel browser con JavaScript. I tuoi dati non vengono mai caricati, quindi lo strumento è sicuro per contenuti sensibili e funziona anche offline.

Domande frequenti

Perché alcuni nomi di campo stanno tra backtick?
Perché Scala accetta tra di essi qualsiasi identificatore, e così la chiave JSON resta il nome del campo. `content-type` e `class` sarebbero altrimenti illegali. Non è solo estetica: le librerie a derivazione come circe usano il nome del campo come nome JSON, quindi tenere la chiave fa sì che la case class decodifichi il tuo documento senza una sola annotazione.
Per quale libreria JSON è pensato?
Per una qualsiasi a derivazione — circe, zio-json, upickle — perché leggono tutte i nomi dei campi. Non viene emesso alcun import né annotazione: nulla qui ti lega a una in particolare. Con il modulo Scala di Jackson vale lo stesso; solo un campo che rinomini a mano richiede un `@JsonProperty`.
Perché nulla è un `Option`?
Perché un campione mostra presenza, mai assenza. Ogni campo c’era, quindi ogni campo è obbligatorio — e `Option[String]` è la modifica da fare quando saprai che la chiave può mancare. Rendere tutto opzionale in partenza trasformerebbe ogni accesso in un `getOrElse` senza che il documento lo sostenga.

Convertitori correlati