Pular para o conteúdo

Converter JSON em case classes Scala — Numio

Transforma uma amostra JSON em case classes Scala. Objetos aninhados viram case classes separadas e arrays viram Seq[...]; valores null e chaves ausentes em alguns itens de um array viram Option[...].

Rascunhar os modelos de uma API JSON antes de adicionar um codec Circe, Play JSON ou uPickle.

JSON

Scala Case Class

Quando usar

  • Rascunhar os modelos de uma API JSON antes de adicionar um codec Circe, Play JSON ou uPickle.
  • Transformar um payload de exemplo de Kafka ou HTTP em case classes para um job Spark ou Akka.

Como usar

  1. Cole um objeto JSON; para campos opcionais, inclua vários itens de array com chaves diferentes.
  2. Confira a saída: a classe raiz é RootInterface e as classes aninhadas recebem o nome da chave em PascalCase (speakers vira Speakers).
  3. Copie as classes, renomeie-as e restrinja qualquer Option[Any] ou Seq[Any] que a amostra não conseguiu tipar.

Entrada JSON

{
  "id": 7,
  "type": "conference",
  "price": 49.9,
  "venue": null,
  "tags": ["jvm", "fp"],
  "speakers": [
    { "name": "Martin", "talk": "Keynote" },
    { "name": "Li", "talk": "Effects", "slides": "https://example.com/s.pdf" }
  ]
}

Case classes Scala

case class RootInterface(
  id: Int,
  `type`: String,
  price: Double,
  venue: Option[Any],
  tags: Seq[String],
  speakers: Seq[Speakers]
)

case class Speakers(
  name: String,
  talk: String,
  slides: Option[String]
)

Detalhes e limitações

Roda no navegador com o gerador próprio do site; não há chamada ao servidor. A página não tem configurações e não adiciona imports nem derivações de codec.

Todos os itens de um array são mesclados: uma chave ausente em alguns itens, ou null em alguns, vira Option[...], e 12 ao lado de 1.5 vira Double.

Um valor que é sempre null gera Option[Any] e um array vazio Seq[Any], porque a amostra não indica nenhum tipo.

Palavras reservadas e chaves que não são identificadores ficam entre crases, como `type`; chaves em snake_case são mantidas como estão.

FAQ

Ele gera Option para campos anuláveis?

Sim. Uma chave cujo valor é null vira Option[...], tipada a partir das outras amostras quando a chave também tem valores reais; caso contrário, Option[Any]. Chaves ausentes em alguns itens de um array também viram Option.

O que acontece com um array JSON na raiz?

Os itens são mesclados em uma única case class RootInterface, com as chaves ausentes em alguns itens como Option, e type RootInterfaceList = Seq[RootInterface] é adicionado.

Um ID de 64 bits é tipado como Long?

Só quando algum valor da amostra está fora do intervalo de Int (cerca de ±2,1 bilhões). Os demais inteiros viram Int, então mude para Long os IDs ou timestamps que podem crescer.

Especificações e referências