Pular para o conteúdo

Converter JSON em classes de dados Kotlin — Numio

Gera data classes Kotlin a partir de uma amostra JSON. Inteiros viram Long, decimais viram Double, cada objeto aninhado ganha sua própria classe e as chaves ausentes em alguns itens de um array viram tipos anuláveis como Boolean?.

Modelar uma resposta REST para um app Android que faz o parse de JSON com Jackson.

JSON

Quando usar

  • Modelar uma resposta REST para um app Android que faz o parse de JSON com Jackson.
  • Criar DTOs para um serviço Ktor ou Spring Boot a partir de um payload de exemplo.

Como usar

  1. Cole um objeto ou array JSON representativo no editor JSON; inclua itens de array que mostrem as chaves opcionais.
  2. Confira o painel Kotlin: a classe de nível superior se chama Root e as classes aninhadas recebem o nome da chave (projects vira Project).
  3. Copie as classes, renomeie Root e substitua Any? ou Long onde o contrato da sua API disser outra coisa.

Entrada JSON

{
  "id": 1024,
  "full_name": "Ada Lovelace",
  "email": null,
  "roles": ["admin", "editor"],
  "projects": [
    { "name": "Engine", "stars": 42 },
    { "name": "Notes", "stars": 7, "archived": true }
  ]
}

Data classes Kotlin

import com.fasterxml.jackson.annotation.JsonProperty

data class Root(
    val id: Long,
    @JsonProperty("full_name")
    val fullName: String,
    val email: Any?,
    val roles: List<String>,
    val projects: List<Project>,
)

data class Project(
    val name: String,
    val stars: Long,
    val archived: Boolean?,
)

Detalhes e limitações

A conversão roda no navegador com o módulo WebAssembly json_typegen; o JSON não é enviado. Esta página não tem configurações.

Chaves que não estão em camelCase recebem uma anotação @JsonProperty do Jackson e o import com.fasterxml.jackson.annotation.JsonProperty. Anotações de kotlinx.serialization ou Moshi não são geradas.

Valores null e arrays vazios não trazem informação de tipo, então viram Any? e List<Any?>.

Campos anuláveis não têm valor padrão (= null). Adicione os padrões você mesmo se o campo puder estar ausente na desserialização.

FAQ

Por que um inteiro é tipado como Long e não Int?

O gerador sempre usa Long para números inteiros, para que IDs grandes não estourem. Números grandes demais para um inteiro de 64 bits, ou escritos com ponto decimal, viram Double.

Posso converter um array JSON na raiz?

Sim. Um array na raiz gera um typealias, por exemplo typealias Root = List<Root2>;, mais uma data class Root2 para o tipo dos itens. Renomeie os dois para se adequarem ao seu código.

Por que um array misto curto virou Pair<Long, String>?

O json_typegen trata um array curto cujos itens têm tipos diferentes como uma tupla, então [1, "a"] vira Pair<Long, String>. Mude para List<Any> se o array for de fato uma lista.

Especificações e referências