100 % local — seus dados nunca saem do seu navegador

JSON para Go — structs prontas para o seu arquivo

Transforme uma amostra JSON em structs Go com tags json. As colunas saem alinhadas como o gofmt deixaria: colar não exige nenhuma limpeza depois.

Instantâneo Privado Zero cookies

Entrada JSON

Saída Go

O que esta ferramenta faz

Uma amostra JSON vira structs Go, um por objeto.

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
type Root struct {
	Id        int     `json:"id"`
	FirstName string  `json:"firstName"`
	Address   Address `json:"address"`
}

type Address struct {
	City string `json:"city"`
}

As colunas vão alinhadas como o gofmt alinha — nome, tipo, tag. Ninguém lê Go sem formatar, e colar isto num arquivo e rodar o gofmt não deve mudar nada.

Esse alinhamento é recente: os campos saíam separados por um único espaço. Coisa pequena, e ainda assim uma saída que não se parecia com a linguagem de que se reclama.

Os nomes são exportados, as chaves vivem na tag

O encoding/json ignora por completo os campos não exportados: um campo minúsculo não decodifica nada e não codifica nada, sem dizer palavra. Por isso todo campo é exportado — PascalCase, com um F à frente quando a chave começa por dígito (2fa dá F2fa) — e a tag leva a chave original, intacta.

Duas chaves que produzem o mesmo nome Go — user-name e userName — ficam separadas por um sufixo numerado. As tags continuam distintas: cada campo ainda corresponde à sua própria chave.

omitempty omite mais do que se pensa

A opção acrescenta ,omitempty a cada tag. Ela vale só na codificação e não distingue «ausente» de «zero»: 0, "", false, um slice vazio e um map nil somem todos da saída.

Serve bem para um filtro opcional e é falso para uma nota que pode valer zero legitimamente. Onde a diferença importa, a resposta habitual é um ponteiro — *int — que codifica null para nil e um zero de verdade caso contrário.

Os tipos, e o que uma amostra não consegue dizer

  • Os inteiros viram int, não int64. Em qualquer plataforma de 64 bits é a mesma coisa; um valor além dela falha alto na decodificação em vez de ser truncado em silêncio.
  • null e os valores desconhecidos viram any. Um array vazio vira []any, um array misto também, salvo quando mistura inteiros e flutuantes — aí []float64 cobre os dois.
  • Nenhum campo é ponteiro e nenhum é opcional, porque uma amostra não pode mostrar isso. Uma chave que às vezes falta é um *T que você acrescenta, e é a primeira coisa a conferir contra uma segunda carga.

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 os nomes de campo começam com maiúscula?
Porque o `encoding/json` só enxerga campos exportados. Um `id` minúsculo seria pulado nos dois sentidos, em silêncio: o struct compilaria, não decodificaria nada naquele campo e não codificaria nada a partir dele. A tag guarda a chave original, então `Id int `json:"id"`` lê e escreve exatamente o que o seu documento tem.
O que a opção omitempty faz de verdade?
Acrescenta `,omitempty` a cada tag, o que deixa de fora um valor zero **na codificação**. Não muda nada na decodificação e não distingue uma chave ausente de um zero: `0`, `""`, `false` e um slice vazio somem todos da saída. Se um zero de verdade importa, um campo ponteiro é a resposta habitual.
Meu campo deve se chamar `Id` ou `ID`?
O guia de estilo do Go diz `ID`, e os linters também dirão. Esta ferramenta escreve `Id`, derivado mecanicamente da chave, porque renomear siglas supõe manter uma lista — `ID`, `URL`, `API`, `HTTP` — e aplicá-la a chaves que ela nunca viu. A tag torna o renome inofensivo: é um retoque seguro para você fazer.

Conversores relacionados