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.