Inicio › Herramientas para desarrolladores › JSON a struct de Go

JSON a struct de Go

Pega un objeto JSON o una respuesta de API y obtén structs de Go listos para usar, con nombres de campo correctos, etiquetas json y tipos inferidos como int64, float64, bool y time.Time. Todo se ejecuta en tu navegador.

Última actualización:

Tu JSON se analiza localmente en esta pestaña y nunca se sube. Consejo: Ctrl + Intro genera el código.

Publicidad
Publicidad

Cómo usar JSON a struct de Go

  1. Pega tu JSON en el cuadro de la izquierda o abre un archivo .json. Hay un ejemplo cargado para que veas el resultado al instante.
  2. Ponle nombre al struct raíz y, si quieres, al paquete (déjalo vacío para omitir la línea package).
  3. Elige las opciones: modo de omitempty, int o int64, structs en línea, punteros para valores null, time.Time y any.
  4. Pulsa Generar structs de Go. Con la actualización en vivo activada, el código se actualiza mientras escribes.
  5. Copia o descarga el archivo .go y decodifica con json.Unmarshal(data, &v).

Ejemplo: de JSON a structs de Go

Esta respuesta de API tiene un objeto anidado, un array de objetos y un valor que puede ser null:

{ "user_id": 42, "name": "Ada", "avatar_url": null,
  "posts": [ { "id": 1, "title": "Hello", "score": 4.5 },
             { "id": 2, "title": "Draft", "score": 3, "cover": "a.png" } ] }

Con las opciones por defecto, el generador produce:

type Root struct {
	UserID    int    `json:"user_id"`
	Name      string `json:"name"`
	AvatarURL any    `json:"avatar_url,omitempty"`
	Posts     []Post `json:"posts"`
}

type Post struct {
	ID    int     `json:"id"`
	Title string  `json:"title"`
	Score float64 `json:"score"`
	Cover string  `json:"cover,omitempty"`
}

score es float64 porque un elemento tiene 4.5, y cover recibe omitempty porque solo un elemento lo tiene. Como avatar_url siempre es null, no se puede saber su tipo real, así que es any: sustitúyelo por *string cuando lo sepas.

Cómo se asignan los valores JSON a tipos de Go

Valor JSONTipo de Go
"text"string
"2024-05-01T09:30:00Z"time.Time (RFC 3339, cuando la opción está activada)
42int, o int64 por encima de 2,147,483,647
3.14, 1e6float64
true / falsebool
"x" o null*string (puntero, así nil significa null)
{ … }Un struct con nombre (o un struct { … } en línea)
{}map[string]any
[1, 2] / [][]int / []any
[1, "two"][]any (Go no tiene tipos unión)

Cómo usar los structs

var root Root
if err := json.Unmarshal(data, &root); err != nil {
	log.Fatal(err)
}
fmt.Println(root.Posts[0].Title)
  • Las claves desconocidas se ignoran. json.Unmarshal omite las claves sin un campo correspondiente. Usa un json.Decoder con DisallowUnknownFields() si quieres una decodificación estricta.
  • time.Time espera RFC 3339. Las marcas de tiempo como 2024-05-01T09:30:00Z se decodifican directamente; otros formatos necesitan un tipo personalizado o un campo string.
  • ID grandes. Los números JSON por encima de 253 pierden precisión en JavaScript pero no en el int64 de Go, así que usa int64 para ID de tipo snowflake.

Preguntas frecuentes

¿Cómo se crean los nombres de campo de Go a partir de las claves JSON?

Cada clave se divide en palabras en los guiones bajos, guiones, espacios y cambios de camelCase, y cada palabra se escribe con mayúscula inicial para que el campo sea exportado. Las siglas comunes se escriben en mayúsculas como exige el estilo de Go, así que user_id pasa a ser UserID y avatar_url pasa a ser AvatarURL. La clave original se conserva en la etiqueta json, así que la decodificación sigue coincidiendo.

¿Por qué los campos son exportados (con mayúscula)?

encoding/json solo puede leer y escribir campos de struct exportados. json.Unmarshal ignoraría sin avisar un campo en minúsculas, así que cada campo generado empieza por mayúscula y la etiqueta json lo asocia con la clave original.

¿Cuándo se añade omitempty?

Por defecto, omitempty se añade a los campos que faltan en algunos elementos de un array o que contienen null, porque son los campos que pueden no estar. Puedes cambiar para añadirlo a todos los campos o a ninguno. Ten en cuenta que omitempty solo afecta a la serialización (codificación); no cambia cómo se decodifica el JSON.

¿Cómo se tipan los números?

Los números enteros pasan a ser int, o int64 si algún valor está fuera del rango de 32 bits (puedes forzar int64 en todas partes). Los números con punto decimal o exponente pasan a ser float64. Si un campo mezcla enteros y decimales, se usa float64.

¿Qué pasa con los valores null y los tipos mezclados?

Un campo que tiene un valor en algunos sitios y null en otros pasa a ser un puntero como *string, para que nil pueda representar null. Un campo que siempre es null, o que mezcla tipos como string y número, pasa a ser any (o interface{}), porque Go no tiene tipos unión.

Structs en línea o separados: ¿cuál debo usar?

Los structs con nombre separados son más fáciles de reutilizar, probar y documentar, por eso son la opción por defecto. Los structs anónimos en línea lo mantienen todo en un solo tipo y son prácticos para respuestas de API puntuales, pero no puedes construirlos fácilmente en otras partes de tu código.

¿Se sube mi JSON?

No. El análisis y la generación de código son JavaScript puro que se ejecuta en esta página, así que las respuestas de API con datos personales o secretos nunca salen de tu dispositivo.

¿Se prueban todas las herramientas de FreeToolCabin para comprobar su calidad y precisión?

Sí. Cada herramienta del sitio pasa pruebas automáticas en navegadores reales para comprobar que el resultado es correcto y que no hay errores. Si encuentras un fallo o tienes una sugerencia, escríbenos a [email protected] y lo revisaremos.

Herramientas relacionadas

Ver todas las de Conversores de datos y formatos de archivo →