Cómo convertir una muestra JSON en tipos Go

Pega una muestra JSON y la herramienta escribe las declaraciones de tipos Go que encajan con ella: structs, slices, campos escalares y las etiquetas json que enlazan cada campo con su clave. Los nombres siguen las convenciones de Go, los objetos anidados pueden quedar en línea o convertirse en tipos con nombre, y las estructuras idénticas se declaran una sola vez.

La conversión se ejecuta en esta pestaña del navegador. No se sube nada ni se hace ninguna petición, así que la página sigue funcionando sin conexión y admite datos que no puedes enviar a terceros.

  1. Pega o escribe el JSON que quieres modelar. El resultado se actualiza mientras editas, así que recorta la muestra hasta que los tipos generados encajen.
  2. Deja marcado Tipos anidados en línea para obtener structs anónimos dentro del padre, o desmárcalo para obtener tipos con nombre separados tras la declaración principal.
  3. Si el JSON está mal formado, el mensaje indica la posición y el carácter problemático queda marcado; corrige la entrada y los tipos vuelven.
  4. Pulsa Copiar struct de Go para llevarte el código y Limpiar para vaciar ambos paneles. Añade tú el bloque de importaciones: el resultado son solo las declaraciones de tipos.

Cómo se deducen los tipos y qué no incluye el resultado

Cómo se deducen los tipos de una muestra

Los números enteros se convierten en int cuando caben en 32 bits y en int64 cuando no; los decimales en float64. Un número escrito como 1.0 sigue siendo float64 aunque parezca entero, y un array que mezcla enteros y decimales pasa a []float64. Un array con valores que no pueden compartir tipo —un número y una cadena, un objeto y un número— cae a []interface{}.

Un array de objetos se fusiona en un solo struct con la unión de sus claves, y la clave que falta en algunos elementos se etiqueta con omitempty. Un campo que en un elemento es un objeto y en otro un escalar pasa a interface{}. Las cadenas con forma de marca de tiempo RFC 3339 (2024-05-06T07:08:09Z) se convierten en time.Time, que exige añadir la importación time a mano.

Nombres, etiquetas y campos opcionales

Los nombres de campo son nombres exportados de Go: user-id pasa a UserID, y las siglas habituales como ID, URL, API y HTTP conservan sus mayúsculas. La clave original se conserva en la etiqueta del struct, de modo que el código generado sigue correspondiendo con el payload que pegaste.

Dos claves que se reducen al mismo nombre Go reciben un sufijo numérico (UserID y UserID2), y las claves formadas solo por símbolos pasan a Field, Field2, etc. Las comillas y barras invertidas dentro de una clave se escapan en la etiqueta para que el código siga siendo válido.

Qué no es el resultado

Solo son declaraciones: sin cláusula package, sin importaciones, sin métodos y sin compilar nada aquí. Los tipos describen la muestra que pegaste, no un esquema: un campo que en esa muestra es null o no aparece se tipa según lo que proporcionaste, así que revisa la nulabilidad y el ancho de los números con un payload más grande.

Los documentos grandes se analizan igualmente en el navegador y están limitados por la memoria de tu dispositivo. Trata el resultado como un punto de partida por revisar: renombra los tipos, añade lo que la muestra no podía mostrar y pasa el archivo por tu compilador después de pegarlo.

Herramientas recientes: