O que esta ferramenta faz
Uma amostra JSON vira case class Scala, uma por objeto.
{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
case class Root(
id: Long,
firstName: String,
address: Address
)
case class Address(
city: String
)
Um array de objetos na raiz também ganha nome: type Root = List[RootItem], um alias de topo, ou seja Scala 3.
As crases guardam a chave
{ "content-type": "text/html", "class": 1 }
case class Root(
`content-type`: String,
`class`: Long
)
O Scala toma por identificador tudo o que estiver entre crases: o nome do campo pode ficar exatamente o que o JSON dizia. Não é escolha cosmética: circe, zio-json e upickle derivam todos o nome JSON do nome do campo, de modo que esta case class lê a sua carga como ela é, sem anotação e sem decodificador sob medida.
O outro caminho — renomear para contentType — pediria um códec configurado para reatar, e uma amostra não pode dizer qual biblioteca você usa.
Os tipos, e os dois que confessam a sua ignorância
Os inteiros viram Long e os decimais Double: um número JSON não cabe com segurança nem num Int nem num Float, e alargar vale mais que um estouro silencioso.
null, um array vazio e um array misto viram todos Any, exatamente tão vago quanto a amostra. Any é incômodo em Scala, e esse incômodo é a graça: marca os campos sobre os quais o documento nada disse, e não finge o contrário.
O que uma amostra não consegue dizer
Nenhum campo é uma Option, nenhum tem valor padrão e nada é um sealed trait: um documento mostra uma forma. Se duas cargas diferem por uma chave, isso é uma união que você modela — e o ponto em que um tipo gerado deixa de servir e o seu desenho começa.
Privado por padrão
Tudo é executado localmente no seu navegador com JavaScript. Os seus dados nunca são enviados para um servidor, o que torna a ferramenta segura para conteúdo sensível e funciona offline.