100 % local — seus dados nunca saem do seu navegador

JSON para Scala — case classes com as chaves

Transforme uma amostra JSON em case classes Scala. Os campos mantêm as chaves JSON, entre crases quando a linguagem exige, prontos para o seu codec.

Instantâneo Privado Zero cookies

Entrada JSON

Saída Scala

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.

Perguntas frequentes

Por que alguns nomes de campo vão entre crases?
Porque o Scala aceita qualquer identificador entre elas, e assim a chave JSON fica como nome do campo. `content-type` e `class` seriam ilegais de outro modo. Não é só aparência: bibliotecas por derivação como o circe usam o nome do campo como nome JSON, então guardar a chave faz a case class decodificar o seu documento sem uma única anotação.
Para qual biblioteca JSON isto foi pensado?
Para qualquer uma por derivação — circe, zio-json, upickle —, já que todas leem os nomes de campo. Nenhum import nem anotação é emitido: nada aqui te prende a uma delas. Com o módulo Scala do Jackson vale o mesmo; só um campo que você renomeie à mão pede um `@JsonProperty`.
Por que nada é uma `Option`?
Porque uma amostra mostra presença, nunca ausência. Todos os campos estavam lá, então todos são obrigatórios — e `Option[String]` é o retoque a fazer quando você souber que a chave pode faltar. Tornar tudo opcional de saída transformaria cada acesso num `getOrElse` sem que o documento sustente isso.

Conversores relacionados