JSON a struct de Go

Genera structs de Go a partir de JSON

Acerca de JSON a struct de Go

JSON a struct de Go convierte una muestra JSON o un JSON Schema en declaraciones de tipos de Go para encoding/json, generadas por quicktype-core en tu navegador. Cada objeto anidado se convierte en su propio struct con nombre, los nombres de los campos siguen el estilo de Go, siglas incluidas (user_id se convierte en UserID), y cada campo conserva la clave original en una etiqueta json, y también en cada otra etiqueta que indiques en «Etiquetas», como yaml o db. Los números enteros son int64 y los números escritos con punto decimal, float64. Cuando pegas un array, una clave que solo tienen algunos elementos se convierte en un puntero con omitempty; «omitempty en cada campo» lo añade a todos los campos, y «Punteros a structs anidados» convierte un campo como Address en *Address. Por defecto, la salida solo contiene las definiciones de tipos: rellena «Paquete» para que empiece con una declaración de paquete, y elige «Tipos y funciones Unmarshal / Marshal» en «Código» para obtener también una función Unmarshal, un método Marshal y los métodos que decodifican un valor de dos tipos. El JSON se puede pegar o abrir desde un archivo .json o .txt.

Ejemplo

Un objeto con una dirección anidada: la dirección recibe su propio struct.

Entrada JSON

{"user_id": 42, "score": 9.5, "tags": ["go", "api"], "address": {"city": "Montreal", "zip": "H2X"}}

Salida struct de Go

type Root struct {
	UserID  int64    `json:"user_id"`
	Score   float64  `json:"score"`
	Tags    []string `json:"tags"`
	Address Address  `json:"address"`
}

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

Cómo convertir JSON en un struct de Go

  1. 1Pega el JSON, por ejemplo la respuesta de una API, en «Entrada JSON», o haz clic en «Abrir un archivo» para cargar un archivo .json o .txt. Para un JSON Schema, elige «JSON Schema» en «Origen».
  2. 2Indica el «Nombre del tipo» y, para una declaración de paquete, el «Paquete»; luego elige el «Código», las «Etiquetas» y las casillas que necesites.
  3. 3Haz clic en «Convertir» para construir los structs en «Salida struct de Go».
  4. 4Haz clic en «Copiar», o en «Descargar» para obtener el archivo «model.go».

Formatos y límites

Entrada
Texto JSON, o JSON Schema, pegado o abierto desde un archivo .json o .txt; con un array, se combinan los campos de todos los elementos
Salida
Declaraciones de structs de Go con etiquetas json y las etiquetas que indiques, guardadas como model.go; una declaración de paquete y funciones Unmarshal / Marshal si las eliges
Tipos numéricos
int64 para los números enteros; float64 para los números escritos con punto decimal o exponente, como 10.0
Fechas
string por defecto; time.Time cuando «Fechas como time.Time» está marcado y un valor es una fecha y hora ISO 8601 como 2024-05-01T10:00:00Z, y para "format": "date-time" en un JSON Schema
Claves opcionales
Tipo puntero con omitempty cuando una clave falta en algunos elementos; solo puntero cuando vale null en algunos; interface{} cuando vale null en toda la muestra
Tipos mezclados
Una clave que contiene un número en un elemento y texto en otro se convierte en un struct con campos puntero Integer y String; encoding/json solo puede llenarlo con el método UnmarshalJSON que añade «Tipos y funciones Unmarshal / Marshal»

Dónde se procesa tu JSON

La generación de los structs se hace en esta pestaña del navegador. El motor quicktype se descarga una sola vez, con tu primer clic, y tu JSON se queda en tu computadora. La página sí envía informes de errores: cuando aparece una línea de error roja, su texto, sin los fragmentos citados, los números largos ni las direcciones, se envía a nuestro registro de errores junto con el nombre de la herramienta y el nombre y la versión de tu navegador, y un fallo inesperado de la página se informa de la misma manera.

Preguntas frecuentes

¿Un campo se vuelve puntero cuando una clave a veces falta o vale null?

Sí. Una clave que falta en al menos un elemento se convierte en un puntero con omitempty, que la omite al codificar; una clave que vale null en un elemento se convierte en un puntero simple, sin omitempty. Si la clave siempre está presente en tus datos reales, cambia *string por string a mano.

¿Qué tipos numéricos usa?

int64 para los números enteros y float64 para los decimales. Un valor escrito como 10.0 cuenta como decimal: se vuelve float64, y un 10.5 recibido más tarde se sigue decodificando. Cambia tú mismo a int o int32 si tus valores son pequeños.

¿Cómo nombra los campos de las claves en snake_case?

Los convierte en nombres de Go exportados y conserva la clave en la etiqueta: user_id se convierte en UserID, y su etiqueta sigue diciendo user_id, así que encoding/json lee y escribe la clave original sin cambios.

¿Puede generar un struct para un array JSON?

Sí. Un array de primer nivel da type Root []RootElement, y los campos de todos los elementos se combinan en RootElement: basta con un elemento sin una clave para que esa clave sea opcional.

¿Puede escribir la declaración de paquete y una función Unmarshal?

Sí. Escribe el nombre del paquete en «Paquete», por ejemplo main o model, para que el código empiece con su declaración. Elige «Tipos y funciones Unmarshal / Marshal» en «Código» para obtener también una función que lee el JSON, como UnmarshalRoot(data), un método Marshal, los imports que necesitan y los métodos UnmarshalJSON y MarshalJSON de un valor de dos tipos; esa opción requiere un nombre de paquete.

¿Puedo añadir omitempty a cada campo, u otras etiquetas además de json?

Sí. Marca «omitempty en cada campo» para que los valores vacíos se omitan al codificar. Indica otras claves de etiqueta en «Etiquetas», separadas por comas, por ejemplo json,yaml o json,db: cada campo recibe entonces una etiqueta por clave, cada una con la clave original.

¿Puedo partir de un JSON Schema?

Sí. Elige «JSON Schema» en «Origen» y luego pega o abre el esquema. Los tipos, las propiedades obligatorias (las demás se vuelven punteros con omitempty), los enums (un tipo string con sus constantes) y los formatos date-time (time.Time) salen del esquema. Un $ref solo se sigue dentro del documento (#/definitions/… o #/$defs/…): un esquema en otra dirección nunca se descarga, y la página lo indica.

Consejos y trucos

  • ✓Pega dos o tres elementos distintos de una lista de una API en lugar de uno, para que las claves que a veces faltan se conviertan en punteros.
  • ✓Marca «Punteros a structs anidados» cuando necesites distinguir un objeto ausente (nil) de uno vacío.