JSON a Go Struct

Genera structs de Go desde JSON

Prueba un ejemplo
Nombre del struct raíz:

Entrada JSON

Salida Go

Se ejecuta localmente · Es seguro pegar secretos
Los structs de Go aparecerán aquí…

¿Qué es la conversión de JSON a structs de Go?

La conversión de JSON a Go transforma datos JSON en definiciones de tipos Go que funcionan con el paquete encoding/json de la biblioteca estándar. Go es un lenguaje de tipado estático, por lo que cada campo JSON necesita un campo de struct correspondiente con el tipo correcto y un struct tag que le indica al serializador qué clave JSON mapear. Escribir estas definiciones a mano para respuestas de API grandes o muy anidadas es lento y fácil de equivocar.

El paquete encoding/json, incluido en la especificación de Go desde la versión 1.0, usa reflexión para hacer coincidir las claves JSON con los campos exportados de los structs. El matching es insensible a mayúsculas por defecto, pero los struct tags json explícitos son la práctica estándar porque eliminan la ambigüedad y permiten usar la convención PascalCase de Go mientras el JSON mantiene camelCase o snake_case. Un conversor automatiza todo esto: lee tu JSON, infiere los tipos Go a partir de los valores y produce definiciones de structs con los tags correctos.

El sistema de tipos de Go se mapea limpiamente a JSON. Las cadenas se convierten en string, los booleanos en bool, los enteros en int y los números de punto flotante en float64. Los objetos JSON anidados se convierten en structs con nombre separados, y los arrays en slices. El único caso especial es null: Go no tiene un tipo nullable universal, por lo que los valores null suelen convertirse en tipos puntero (*string, *int) o en interface{}. Un generador gestiona todo esto en milisegundos.

¿Por qué usar un conversor de JSON a Go?

Definir structs de Go a partir de JSON a mano implica contar llaves, adivinar tipos y reescribir tags cada vez que la API cambia. Un conversor elimina esa fricción.

Generación de tipos instantánea
Pega tu JSON y obtén definiciones correctas de structs Go en menos de un segundo. Sin escribir campos a mano, sin tags olvidados, sin problemas de alineación.
🔒
Procesamiento con privacidad garantizada
La conversión se ejecuta íntegramente en tu navegador. Tu JSON nunca sale de tu equipo. Las claves de API, tokens y datos de usuarios permanecen privados.
🏷️
Struct tags correctos
Cada campo generado incluye un struct tag json que mapea el nombre del campo Go a la clave JSON original. Esto evita discrepancias silenciosas durante json.Unmarshal.
📦
Sin instalación ni registro
Abre la página y pega tu JSON. No necesitas tener la toolchain de Go, no hay herramientas CLI que instalar ni cuentas que crear.

Casos de uso de JSON a Go Struct

Desarrollo de clientes REST
Genera structs de solicitud y respuesta para APIs REST de terceros. Pega JSON de ejemplo de la documentación de la API y obtén tipos listos para usar con http.Client y json.NewDecoder.
Modelos para gRPC Gateway
Cuando un servicio Go expone endpoints tanto de gRPC como REST, necesitas structs Go que coincidan con los payloads JSON. Convierte la forma JSON en structs que se ajusten a tus definiciones protobuf.
Parseo de configuraciones DevOps
Parsea archivos de configuración JSON (salidas de Terraform, manifiestos de Kubernetes, configuraciones de pipelines CI/CD) en structs Go tipados para herramientas personalizadas y scripts de automatización.
Procesamiento en pipelines de datos
Construye structs Go para registros JSON provenientes de colas de mensajes (Kafka, RabbitMQ, SQS) o data lakes. Los structs tipados detectan cambios de esquema en tiempo de compilación en lugar de en tiempo de ejecución.
Configuración de fixtures de pruebas
Convierte fixtures JSON de prueba en structs Go para tests basados en tablas. Los fixtures con tipado seguro hacen que los fallos de tests sean más fáciles de diagnosticar que las aserciones sobre map[string]interface{}.
Aprendizaje del sistema de tipos de Go
Estudiantes y desarrolladores que vienen de lenguajes dinámicos pueden pegar JSON conocido y ver cómo Go representa los mismos datos con tipos explícitos, punteros y struct tags.

Mapeo de tipos JSON a Go

El paquete encoding/json sigue reglas específicas al mapear valores JSON a tipos Go. La tabla muestra el mapeo por defecto y las alternativas más comunes. La columna "Por defecto" muestra lo que producen la mayoría de los generadores. La columna "Alternativa" muestra tipos que podrías elegir según tus requisitos, como int64 para IDs grandes o tipos puntero para campos nullable.

Tipo JSONEjemploPor defectoAlternativa
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{}

Referencia de struct tags JSON en Go

Los struct tags controlan cómo encoding/json serializa y deserializa los campos. El tag json es con diferencia el más común, pero puedes combinarlo con otros tags (db, yaml, xml) en el mismo campo. La sintaxis del tag es una cadena delimitada por backticks tras el tipo del campo. A continuación se muestran las opciones del tag json que soporta encoding/json.

TagComportamientoCaso 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 ofrece dos formas de decodificar JSON: json.Unmarshal para slices de bytes y json.NewDecoder para flujos io.Reader. Ambos usan las mismas reglas de struct tags, pero difieren en cuándo usarlos.

json.Unmarshal
Toma un []byte y rellena un struct. Es la mejor opción para JSON que ya está completamente en memoria: cuerpos de respuesta HTTP leídos con io.ReadAll, contenidos de archivos o fixtures de pruebas. Devuelve un error si el JSON está mal formado o los tipos no coinciden.
json.NewDecoder
Envuelve un io.Reader y decodifica tokens JSON a medida que llegan. Es la mejor opción para fuentes en streaming: cuerpos de respuesta HTTP leídos directamente, logs JSON separados por saltos de línea (NDJSON) o archivos grandes que no quieres cargar enteros en memoria. Llama a Decode() en un bucle con More() para flujos de múltiples objetos.

Ejemplos de código

Estos ejemplos muestran cómo usar structs Go generados a partir de JSON en programas reales, y cómo generarlos desde otros lenguajes. Los ejemplos de Go usan encoding/json de la biblioteca estándar.

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
}

Preguntas frecuentes

¿Cuál es la diferencia entre json.Unmarshal y json.Decode?
json.Unmarshal toma un []byte con el documento JSON completo y rellena un struct. json.NewDecoder envuelve un io.Reader y decodifica JSON de forma incremental. Usa Unmarshal cuando ya tienes el JSON completo en memoria (por ejemplo, tras io.ReadAll). Usa NewDecoder cuando lees directamente desde un cuerpo de respuesta HTTP, un archivo o cualquier fuente en streaming donde quieras evitar almacenar todo el payload en memoria.
¿Cómo gestiona Go los campos JSON ausentes en el payload?
Los campos JSON ausentes dejan el campo del struct Go en su valor cero: "" para strings, 0 para números, false para bools, nil para punteros y slices. Si necesitas distinguir entre "campo ausente" y "campo presente pero con valor cero", usa un tipo puntero como *int o *string. Un puntero nil significa que el campo estaba ausente; un puntero no nil con valor cero significa que se estableció explícitamente a 0 o "".
¿Por qué los campos de los structs Go deben ser exportados (con mayúscula) para JSON?
El paquete encoding/json usa reflexión para acceder a los campos de los structs, y las reglas de reflexión de Go solo permiten acceder a campos exportados (con mayúscula inicial). Si un campo comienza con minúscula, encoding/json no puede verlo y lo omitirá silenciosamente tanto durante el marshaling como el unmarshaling. Usa el struct tag json para mapear un campo exportado en PascalCase a una clave JSON en minúsculas.
¿Cómo gestiono claves JSON en snake_case en Go?
Añade un struct tag json con el nombre exacto de la clave JSON. Por ejemplo, un campo JSON "user_name" se mapea a un campo Go UserName con el tag `json:"user_name"`. El generador gestiona esto automáticamente. No existe ninguna opción global en encoding/json para establecer una política de nomenclatura; cada campo debe declarar su propio tag.
¿Puedo convertir JSON con valores null a Go?
Sí. Los valores null en JSON se mapean a tipos puntero en Go. Un campo como "age": null se convierte en Age *int `json:"age"`. Cuando el valor JSON es null, el puntero Go es nil. Cuando tiene un valor, Go asigna un int y el puntero lo referencia. Para campos que siempre son nullable, usar un puntero es el enfoque idiomático en Go.
¿Qué ocurre si el JSON contiene un número mayor de lo que puede almacenar int en Go?
El tipo int de Go depende de la plataforma (32 bits en sistemas de 32 bits, 64 bits en sistemas de 64 bits). Para números grandes como timestamps de JavaScript o IDs de base de datos, usa int64 explícitamente. Si el número JSON tiene decimales, usa float64. Para números que superan la precisión de float64 (por ejemplo, valores financieros grandes), usa json.Number, que conserva la representación en cadena original y te permite parsearlo tú mismo.
¿Hay alguna diferencia entre esta herramienta y JSON-to-Go-Struct?
Esta herramienta genera definiciones de tipos Go con foco en los patrones de uso de encoding/json: struct tags correctos, inferencia de tipos adecuada y gestión de estructuras anidadas y arrays. La herramienta JSON a Go Struct de este sitio se centra en el scaffolding de structs. Ambas producen código Go válido. Usa la que mejor se adapte a tu flujo de trabajo. La referencia de struct tags y las tablas de mapeo de tipos de esta página son útiles independientemente del generador que elijas.