Conversor JSON para Go Struct

Gere structs Go a partir de JSON

Experimente um exemplo
Nome da struct raiz:

Entrada JSON

Saída Go

Roda localmente · Seguro para colar segredos
As structs Go aparecerão aqui…

O que é a conversão de JSON para Go Struct?

A conversão de JSON para Go transforma dados JSON brutos em definições de tipos Go que funcionam com o pacote encoding/json da biblioteca padrão do Go. Go é estaticamente tipado, portanto cada campo JSON precisa de um campo struct correspondente com o tipo correto e uma struct tag que indica ao serializador qual chave JSON mapear. Escrever essas definições manualmente para respostas de API grandes ou profundamente aninhadas é lento e sujeito a erros.

O pacote encoding/json, definido na especificação do Go desde a versão 1.0, usa reflexão para associar chaves JSON a campos struct exportados. A correspondência não diferencia maiúsculas de minúsculas por padrão, mas json struct tags explícitas são a prática padrão porque eliminam ambiguidade e permitem usar a convenção PascalCase do Go enquanto o JSON permanece em camelCase ou snake_case. Um conversor automatiza tudo isso: lê seu JSON, infere tipos Go a partir dos valores e produz definições struct com as tags corretas.

O sistema de tipos do Go mapeia de forma limpa para JSON. Strings se tornam string, booleanos se tornam bool, inteiros se tornam int e números de ponto flutuante se tornam float64. Objetos JSON aninhados se tornam structs nomeadas separadas, e arrays se tornam slices. A única lacuna é o null: Go não tem um tipo nullable universal, portanto valores null tipicamente se tornam tipos ponteiro (*string, *int) ou interface{}. Um gerador cuida de tudo isso em milissegundos.

Por que usar um conversor de JSON para Go?

Definir structs Go a partir de JSON manualmente significa contar chaves, adivinhar tipos e reescrever tags toda vez que a API muda. Um conversor elimina esse atrito.

Geração de tipos instantânea
Cole seu JSON e obtenha definições corretas de structs Go em menos de um segundo. Sem digitação manual de campos, sem tags esquecidas, sem problemas de alinhamento.
🔒
Processamento com privacidade
A conversão ocorre inteiramente no seu navegador. Seu JSON nunca sai da sua máquina. Chaves de API, tokens e dados de usuários permanecem privados.
🏷️
Struct tags corretas
Cada campo gerado inclui uma json struct tag que mapeia o nome do campo Go para a chave JSON original. Isso evita incompatibilidades silenciosas durante json.Unmarshal.
📦
Sem instalação ou cadastro
Abra a página e cole seu JSON. Nenhuma toolchain Go necessária, nenhuma ferramenta de CLI para instalar, nenhuma conta para criar.

Casos de uso de JSON para Go Struct

Desenvolvimento de Clientes REST API
Gere structs de requisição e resposta para APIs REST de terceiros. Cole um JSON de exemplo da documentação da API e obtenha tipos prontos para http.Client e json.NewDecoder.
Modelos de Gateway gRPC
Quando um serviço Go expõe endpoints gRPC e REST ao mesmo tempo, você precisa de structs Go que correspondam aos payloads JSON. Converta o formato JSON em structs que se alinhem às suas definições protobuf.
Parsing de Configurações de DevOps
Faça o parsing de arquivos de configuração JSON (saídas do Terraform, manifestos do Kubernetes, configurações de pipelines CI/CD) em structs Go tipadas para ferramentas personalizadas e scripts de automação.
Processamento em Pipelines de Dados
Construa structs Go para registros JSON de filas de mensagens (Kafka, RabbitMQ, SQS) ou data lakes. Structs tipadas detectam mudanças de esquema em tempo de compilação, não em tempo de execução.
Configuração de Fixtures de Teste
Converta fixtures JSON de testes em structs Go para testes orientados a tabela. Fixtures com segurança de tipos facilitam o diagnóstico de falhas de teste em comparação com asserções map[string]interface{} brutas.
Aprendendo o Sistema de Tipos do Go
Estudantes e desenvolvedores vindos de linguagens dinâmicas podem colar JSON familiar e ver como o Go representa os mesmos dados com tipos explícitos, ponteiros e struct tags.

Mapeamento de Tipos JSON para Go

O pacote encoding/json segue regras específicas ao mapear valores JSON para tipos Go. A tabela abaixo mostra o mapeamento padrão e alternativas comuns. A coluna "Padrão" mostra o que a maioria dos geradores produz. A coluna "Alternativa" mostra tipos que você pode escolher com base nos seus requisitos, como int64 para IDs grandes ou tipos ponteiro para campos anuláveis.

Tipo JSONExemploPadrãoAlternativa
string"hello"stringstring
number (integer)42intint64
number (float)3.14float64float64
booleantrueboolbool
nullnullinterface{}*string / *int
object{"k": "v"}structstruct
array of strings["a", "b"][]string[]string
array of objects[{"id": 1}][]Item[]Item
mixed array[1, "a"][]interface{}[]interface{}

Referência de Struct Tags JSON do Go

Struct tags controlam como encoding/json serializa e desserializa campos. A tag json é de longe a mais comum, mas você pode combiná-la com outras tags (db, yaml, xml) no mesmo campo. A sintaxe da tag é uma string delimitada por crases após o tipo do campo. A seguir estão as opções de tag json suportadas por encoding/json.

TagComportamentoCaso de Uso
json:"name"Maps struct field to JSON key "name"Always generated
json:"name,omitempty"Omits field from output if zero valueOptional fields
json:"-"Field is never serialized or deserializedInternal fields
json:"name,string"Encodes int/bool as JSON stringString-encoded numbers

json.Unmarshal vs json.NewDecoder

Go oferece duas formas de decodificar JSON: json.Unmarshal para byte slices e json.NewDecoder para streams io.Reader. Ambos usam as mesmas regras de struct tags, mas diferem em quando utilizá-los.

json.Unmarshal
Recebe um []byte e popula uma struct. Ideal para JSON que já está completamente em memória: corpos de resposta HTTP lidos com io.ReadAll, conteúdo de arquivos ou fixtures de testes. Retorna um erro se o JSON estiver malformado ou os tipos não corresponderem.
json.NewDecoder
Envolve um io.Reader e decodifica tokens JSON conforme chegam. Ideal para fontes de streaming: corpos de resposta HTTP lidos diretamente, logs JSON delimitados por nova linha (NDJSON) ou arquivos grandes que você não quer carregar inteiramente na memória. Chame Decode() em um loop com More() para streams com múltiplos objetos.

Exemplos de Código

Estes exemplos mostram como usar structs Go geradas a partir de JSON em programas reais, além de como gerá-las a partir de outras linguagens. Os exemplos Go usam encoding/json da biblioteca padrão.

Go (json.Unmarshal)
package main

import (
	"encoding/json"
	"fmt"
)

type User struct {
	ID       int      `json:"id"`
	Name     string   `json:"name"`
	Email    string   `json:"email"`
	IsActive bool     `json:"is_active"`
	Tags     []string `json:"tags"`
}

func main() {
	data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)

	var user User
	if err := json.Unmarshal(data, &user); err != nil {
		panic(err)
	}
	fmt.Println(user.Name)  // → Alice
	fmt.Println(user.Tags)  // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }

// Equivalent Go struct:
// type User struct {
//     ID    int    `json:"id"`
//     Name  string `json:"name"`
//     Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json

def json_to_go(data: dict, name: str = "Root") -> str:
    lines = [f"type {name} struct {{"]
    type_map = {str: "string", int: "int", float: "float64", bool: "bool"}

    for key, value in data.items():
        go_type = type_map.get(type(value), "interface{}")
        field = key.title().replace("_", "")  # snake_case → PascalCase
        lines.append(f'\t{field} {go_type} `json:"{key}"`')
    lines.append("}")
    return "\n".join(lines)

data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
#     UserName string `json:"user_name"`
#     Age      int    `json:"age"`
#     Verified bool   `json:"verified"`
# }
Go (json.Decoder for streams)
package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Event struct {
	Type    string `json:"type"`
	Payload string `json:"payload"`
}

func main() {
	stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)

	dec := json.NewDecoder(stream)
	for dec.More() {
		var ev Event
		if err := dec.Decode(&ev); err != nil {
			break
		}
		fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
	}
	// → click: btn-1
	// → scroll: page-2
}

Perguntas Frequentes

Qual é a diferença entre json.Unmarshal e json.Decode?
json.Unmarshal recebe um []byte contendo o documento JSON completo e popula uma struct. json.NewDecoder envolve um io.Reader e decodifica JSON de forma incremental. Use Unmarshal quando já tiver o JSON completo em memória (por exemplo, após io.ReadAll). Use NewDecoder ao ler diretamente de um corpo de resposta HTTP, um arquivo ou qualquer fonte de streaming onde você queira evitar armazenar o payload inteiro em buffer.
Como o Go lida com campos JSON ausentes no payload?
Campos JSON ausentes deixam o campo struct Go correspondente no seu valor zero: "" para strings, 0 para números, false para bools, nil para ponteiros e slices. Se você precisar distinguir entre "campo ausente" e "campo presente mas zero", use um tipo ponteiro como *int ou *string. Um ponteiro nil significa que o campo estava ausente; um ponteiro não-nil com valor zero significa que foi explicitamente definido como 0 ou "".
Por que campos struct Go precisam ser exportados (com inicial maiúscula) para JSON?
O pacote encoding/json usa reflexão para acessar campos struct, e as regras de reflexão do Go permitem acesso apenas a campos exportados (com inicial maiúscula). Se um campo começa com letra minúscula, encoding/json não consegue vê-lo e o ignorará silenciosamente durante a serialização e desserialização. Use a json struct tag para mapear um campo PascalCase exportado para uma chave JSON em minúsculas.
Como lidar com chaves JSON em snake_case no Go?
Adicione uma json struct tag com o nome exato da chave JSON. Por exemplo, um campo JSON "user_name" mapeia para um campo Go UserName com a tag `json:"user_name"`. O gerador cuida disso automaticamente. Não há uma opção global em encoding/json para definir uma política de nomenclatura; cada campo deve declarar sua própria tag.
Posso converter JSON com valores null para Go?
Sim. Valores JSON null mapeiam para tipos ponteiro em Go. Um campo como "age": null se torna Age *int `json:"age"`. Quando o valor JSON é null, o ponteiro Go é nil. Quando tem um valor, Go aloca um int e o ponteiro o referencia. Para campos que são sempre anuláveis, usar um ponteiro é a abordagem idiomática em Go.
O que acontece se o JSON contiver um número maior do que o int do Go consegue armazenar?
O int do Go depende da plataforma (32 bits em sistemas de 32 bits, 64 bits em sistemas de 64 bits). Para números grandes como timestamps JavaScript ou IDs de banco de dados, use int64 explicitamente. Se o número JSON tiver casas decimais, use float64. Para números que excedem a precisão de float64 (por exemplo, valores financeiros grandes), use json.Number, que mantém a representação em string bruta e permite que você mesmo faça o parsing.
Há diferença entre esta ferramenta e JSON-to-Go-Struct?
Esta ferramenta gera definições de tipos Go com foco nos padrões de uso de encoding/json: struct tags corretas, inferência de tipos adequada e tratamento de estruturas aninhadas e arrays. A ferramenta JSON to Go Struct neste site tem foco em scaffolding de structs. Ambas produzem código Go válido. Use a que melhor se adapta ao seu fluxo de trabalho. A referência de struct tags e as tabelas de mapeamento de tipos nesta página são úteis independentemente do gerador escolhido.