100 % local — seus dados nunca saem do seu navegador

JSON para Kotlin — data classes prontas para colar

Transforme uma amostra JSON em data classes Kotlin. Os nomes continuam os do JSON, entre crases onde a linguagem exige, prontos para compilar.

Instantâneo Privado Zero cookies

Entrada JSON

Saída Kotlin

O que esta ferramenta faz

Uma amostra JSON vira data class Kotlin, uma por objeto.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
data class Root(
    val id: Long,
    val firstName: String,
    val address: Address,
)

data class Address(
    val city: String,
)

Toda propriedade é um val: uma carga decodificada é um valor. As data class dão equals, hashCode, toString e copy() — esta última é como se muda um campo sem mutar nada.

A chave continua sendo a chave

Os identificadores do Kotlin se escrevem entre crases, e isso basta para guardar uma chave JSON como está:

data class Root(
    val `content-type`: String,
    val `class`: Long,
    val `2fa`: Boolean,
)

class é palavra-chave, content-type tem hífen, 2fa começa por dígito — nada disso importa entre crases. Com o kotlinx.serialization, o nome da propriedade é o nome JSON: isso decodifica como está, sem anotação alguma.

Com Jackson ou Moshi, o nome da propriedade também é o que eles procuram, então os nomes entre crases funcionam ali também. Só se você decidir renomear uma propriedade — contentType em vez de `content-type` — é que precisa de @JsonProperty("content-type") ou @Json(name = "content-type") para voltar a apontar para a chave.

Os tipos, e o ? que não está lá

  • Os inteiros viram Long e os decimais Double, o que um número JSON carrega sem discussão.
  • null e os valores desconhecidos viram Any? — o único lugar onde aparece um ponto de interrogação, porque é o único onde a amostra mostrou um.
  • Um array vazio ou misto vira List<Any>.

Nada mais aceita nulo e nada tem valor padrão. Um campo às vezes ausente é um ? e um = null que você acrescenta, depois que uma segunda carga lhe disser o que esta não pôde.

Duas chaves, duas propriedades

Duas chaves que colidiriam como nomes de propriedade ficam separadas em vez de fundidas: a segunda leva um sufixo numerado. Como o nome entre crases é o nome JSON, as colisões aqui são raras: só acontecem quando o conserto é inevitável.

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 minha propriedade se chama `` `content-type` `` com crases?
Porque o Kotlin aceita qualquer identificador entre crases, e é assim que se guarda a chave JSON como nome de propriedade. Com kotlinx.serialization o nome da propriedade *é* o nome JSON: nada mais é preciso. Com Jackson ou Moshi o mesmo resultado pede uma anotação — `@JsonProperty` ou `@Json(name = …)` — acrescentada à mão.
Os campos deveriam ser `val` ou `var`?
`val`, porque uma carga decodificada é um valor, não um formulário. Tornar tudo mutável convida a código que altera o objeto no lugar e depois se pergunta qual versão está olhando. Onde realmente for preciso alterar, `copy()` devolve uma instância nova com um campo trocado — o idioma para o qual as data class existem.
Por que nenhum valor padrão?
Porque um padrão é uma afirmação sobre o que uma chave ausente significa, e uma amostra nunca mostra uma chave ausente. Um `= null` transformaria «ausente» em «null» para toda a base de código. Acrescentá-lo é uma palavra quando você conhece a API; adivinhá-lo é uma decisão que ninguém pediu a esta ferramenta.

Conversores relacionados