Conversor de JSON a Struct de Go

Pega un objeto JSON (o un array JSON) para generar automáticamente las definiciones de struct de Go correspondientes con etiquetas json.

Consejos de uso

  • Cuando todos los elementos de un array son objetos, sus claves se combinan en un solo struct. Las claves que faltan en algunos elementos reciben automáticamente una etiqueta json `omitempty`.
  • El nombre del tipo raíz es "Root" por defecto, pero puedes cambiarlo por el que prefieras. Los nombres de struct para objetos anidados se generan automáticamente convirtiendo el nombre de la propiedad a PascalCase.
  • El valor null de JSON se genera como `interface{}` porque Go no tiene un tipo primitivo nativo que admita null. Considera usar un tipo puntero si necesitas un manejo más estricto.
  • El resultado es un borrador con columnas ligeramente alineadas. Pasarlo por `gofmt` después de pegarlo lo ajustará al estilo estándar de tu proyecto.
  • Pega tal cual una respuesta JSON de ejemplo de tu API para obtener rápidamente un borrador del struct de respuesta que usarás en tu código Go.

Preguntas frecuentes

Escribir un struct a mano a partir de una respuesta de ejemplo lleva tiempo y es propenso a errores: es fácil equivocarse al convertir un nombre de campo u olvidar una etiqueta json, sobre todo con objetos muy anidados. Generarlo automáticamente ahorra mucho tiempo de implementación y evita estos errores.

Las claves JSON (en snake_case o camelCase) se convierten a PascalCase, con la primera letra en mayúscula, para obtener nombres de campo exportables en Go. La clave JSON original se conserva tal cual en la etiqueta json (`json:"clave_original"`), por lo que la codificación y decodificación siguen funcionando correctamente.

Un valor null se genera como el tipo `interface{}`. Una clave que solo aparece en algunos elementos de un array recibe automáticamente una etiqueta json `omitempty`, pero el tipo de Go en sí solo toma su valor cero, así que considera usar un puntero si necesitas distinguir "ausente" de "cero".

Un número JSON con punto decimal se clasifica como `float64`, y uno sin punto decimal como `int`. Como la notación numérica de JSON solo conserva los dígitos, ajusta manualmente el tipo después para valores lo bastante grandes como para necesitar `int64`.

Como Go no tiene tipos unión, una clave cuyo tipo difiere entre elementos recae en `interface{}`. Tendrás que usar una aserción de tipo en tiempo de ejecución para determinar el tipo real del valor.
ツールくん

A propósito — Por qué Go combina structs con etiquetas json

Go es un lenguaje de tipado estático, y al trabajar con JSON, el paquete `encoding/json` de la biblioteca estándar depende de la correspondencia entre los campos del struct y sus etiquetas json para codificar y decodificar datos. Escribir a mano un struct para la forma de la respuesta de una API externa es una tarea repetitiva que crece cada vez que se añade un campo, y se ha repetido en muchos proyectos de Go.

Esta herramienta analiza la estructura de un JSON de ejemplo y genera automáticamente las definiciones de struct y las etiquetas json correspondientes, reduciendo ese trabajo repetitivo. Una herramienta conocida en este mismo espacio es quicktype, que admite convertir a tipos de varios lenguajes; pero para el caso más simple de pegar una respuesta de API de ejemplo y obtener rápidamente un struct de Go, una herramienta enfocada en una sola tarea tiene su propia comodidad.

Como Go no tiene ninguna característica del lenguaje para hacer opcional un campo de struct, el enfoque habitual para los campos JSON que podrían faltar es añadir `omitempty` a la etiqueta json, o usar un tipo puntero (como `*string`) para distinguir un valor cero de "ningún valor". El struct generado es solo una inferencia mecánica a partir de la estructura, así que tratar la posibilidad de null y los futuros cambios de la API como algo que se debe verificar y ajustar a mano contra la especificación real es la práctica habitual.