100 % local: tus datos nunca salen de tu navegador

JSON a Scala — case classes con las claves intactas

Convierte una muestra JSON en case classes de Scala. Los campos conservan las claves JSON, entre acentos graves si hace falta, listos para tu códec.

Instantáneo Privado Cero cookies

Entrada JSON

Salida Scala

Qué hace esta herramienta

Una muestra JSON pasa a ser case class de Scala, una por objeto.

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

case class Address(
  city: String
)

Un array de objetos en la raíz también recibe nombre: type Root = List[RootItem], un alias de nivel superior, o sea Scala 3.

Los acentos graves conservan la clave

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

Scala toma por identificador todo lo que va entre acentos graves: el nombre del campo puede quedarse tal cual lo decía el JSON. No es una elección cosmética: circe, zio-json y upickle derivan el nombre JSON del nombre de campo, de modo que esta case class lee tu carga como está, sin anotación ni decodificador a medida.

La otra vía —renombrar a contentType— pediría un códec configurado para volver a atarlo, y una muestra no puede decir qué biblioteca usas.

Los tipos, y los dos que confiesan su ignorancia

Los enteros pasan a Long y los decimales a Double: un número JSON no cabe de forma fiable ni en un Int ni en un Float, y ensanchar vale más que un desbordamiento silencioso.

null, un array vacío y uno mezclado pasan todos a Any, exactamente tan vago como la muestra. Any es incómodo en Scala, y esa incomodidad es la gracia: marca los campos sobre los que el documento no dijo nada, y no finge lo contrario.

Lo que una muestra no puede decir

Ningún campo es una Option, ninguno tiene valor por defecto y nada es un sealed trait: un documento enseña una forma. Si dos cargas difieren en una clave, eso es una unión que modelas tú, y el punto donde un tipo generado deja de servir y empieza tu diseño.

Privado por diseño

Todo se ejecuta localmente en tu navegador con JavaScript. Tus datos nunca se suben a un servidor, lo que hace que la herramienta sea segura para contenido sensible y funcione sin conexión.

Preguntas frecuentes

¿Por qué algunos nombres de campo van entre acentos graves?
Porque Scala admite cualquier identificador entre ellos, y así la clave JSON se queda como nombre de campo. `content-type` y `class` serían ilegales de otro modo. No es solo cuestión de aspecto: las bibliotecas por derivación como circe usan el nombre del campo como nombre JSON, así que conservar la clave hace que la case class decodifique tu documento sin una sola anotación.
¿Para qué biblioteca JSON está pensado?
Para cualquiera por derivación —circe, zio-json, upickle—, ya que todas leen los nombres de campo. No se emite ningún import ni anotación: nada aquí te ata a una. Con el módulo Scala de Jackson pasa lo mismo; solo un campo que renombres a mano pide un `@JsonProperty`.
¿Por qué nada es una `Option`?
Porque una muestra enseña presencia, nunca ausencia. Todos los campos estaban, así que todos son obligatorios, y `Option[String]` es el retoque que harás cuando sepas que la clave puede faltar. Volverlo todo opcional de entrada convertiría cada acceso en un `getOrElse` sin que el documento lo respalde.

Convertidores relacionados