Pular para o conteúdo

JSON para structs Go

JSON to Go Structs

Gera structs Go com tags json a partir de um exemplo de JSON, incluindo tipos aninhados e repetidos.

Gera structs de Go com tags `json:` a partir de um documento de exemplo, para que o corpo de uma resposta vire algo em que `encoding/json` consiga fazer unmarshal. Os nomes dos campos são exportados em camel case e a chave original fica na tag, que é a parte que as pessoas erram à mão.

🔒 Roda inteiramente no seu navegadorgojsoncodegenstruct
Gerar

JSON de exemplo

Solte um arquivo .json

Lido nesta aba. Nada é enviado.

Dê todos os elementos que você tiver. Cada registro a mais estreita o palpite: um campo que falta em um deles é o que o torna opcional.

TypeScript

Como usar

  1. Cole todos os registros que você tiver

    Cada elemento de cada array é lido e mesclado, não só o primeiro. Três registros dizem muito mais do que um, porque um campo ausente em um deles é exatamente o que torna esse campo opcional.

  2. Dê nome ao tipo raiz

    Objetos aninhados recebem o nome da chave que os contém, no singular para arrays, então `users` produz um `User`. Só a raiz precisa de um nome seu.

  3. Leia as contagens abaixo da saída

    Tipos, campos opcionais, uniões e quantos registros foram mesclados. Uma contagem de uniões acima de zero significa que um campo teve dois tipos de valor diferentes na sua amostra — vale olhar antes de colar o resultado em uma base de código.

  4. Cole as structs em um pacote

    Campos que faltavam em alguns registros recebem `,omitempty` na tag, para que uma ida e volta por marshal não os invente. Nenhuma cláusula package é emitida: você sabe para onde ela vai.

Perguntas frequentes

Por que todo número é `float64`?

Só quando a amostra tinha um valor fracionário. Se todos os números do documento eram inteiros, o campo é emitido com um tipo inteiro. Não há como distinguir um `1` de JSON que é um id de um `1` de JSON que é um preço arredondado, então a amostra é toda a evidência que existe.

E um campo que é null em alguns registros?

Ele vira um tipo ponteiro, que é como Go distingue “ausente ou null” de “zero”. Isso significa que desreferenciá-lo exige uma checagem de nil — chato, e a razão pela qual a alternativa (um valor simples que se lê em silêncio como 0 ou "") é pior.

Ele lida com uma chave que não é um identificador Go válido?

O nome do campo é limpo — separadores removidos, cada parte com inicial maiúscula — e a chave crua fica na tag `json:`, que é o que de fato faz a correspondência. Uma chave `user-id` vira algo como `UserID` com `json:"user-id"` ao lado.

Campos `time.Time` são produzidos?

Não. Um timestamp em JSON é uma string, e transformá-lo em `time.Time` mudaria o que o unmarshal aceita. Se você quiser isso, troque o tipo do campo à mão: `encoding/json` analisa RFC 3339 para `time.Time` sozinho.

Pode receber de

Em seguida

Estas aceitam o que esta ferramenta produz, então o resultado pode ir direto.