MiServe DevTools

Tus pegatinas

Fija aquí tus herramientas. Se guardan en este navegador.

Conversor de JSON a struct de Go y TypeScript

Convierte una muestra de JSON en structs de Go, interfaces o tipos de TypeScript, o un JSON Schema, detectando claves opcionales, null y fechas.

Funciona en tu navegador. Nada de lo que pegas se sube.

Acerca de esta herramienta

Qué se deduce de la muestra

La herramienta recorre el valor JSON y anota lo que encuentra en cada posición. Los elementos de un array se combinan en una sola descripción: una clave que falta en algunos objetos pasa a ser opcional, un valor que a veces es null pasa a ser anulable, y un array con valores de distintos tipos se convierte en una unión en TypeScript y en []any en Go.

Un número es entero solo si todas sus muestras están escritas sin punto decimal ni exponente y caben en un entero de 64 bits con signo; si no, es un número de coma flotante. Una cadena pasa a ser una fecha con hora solo si todas sus muestras son fechas con hora RFC 3339, como 2026-11-14T10:00:00Z. Una fecha sin hora se queda como cadena.

Cada objeto anidado recibe un tipo con el nombre de su clave. Para los elementos de un array, el nombre se pasa a singular cuando la clave es un plural inglés regular, así que users da User y categories da Category; en otro caso se añade Item al final. Con Tipos anidados en línea, los objetos anidados se escriben dentro de su padre.

La salida en Go

Los nombres de campo se exportan y siguen la convención de Go para las siglas, así que user_id se convierte en UserID y html_url en HTMLURL, mientras que la etiqueta json conserva la clave original. Los enteros son int, o int64 cuando una muestra no cabe en 32 bits, porque la especificación de Go permite que int tenga 32 bits. Los demás números son float64 y las fechas con hora, time.Time. La diferencia entre 1 y 1.0 importa: encoding/json se niega a decodificar 1.0 en un campo int.

Con Añadir omitempty a los campos opcionales activado, una clave que falta en algunas muestras recibe omitempty en su etiqueta y mantiene su tipo simple. Un escalar o un struct que puede ser null se convierte en un puntero, como *string, para que null y el valor cero sigan siendo distintos; un slice o un map no necesita puntero, porque puede ser nil. Un valor que solo es null se convierte en any. Los structs anidados opcionales y los campos time.Time opcionales también se convierten en punteros, porque omitempty nunca omite un valor de tipo struct. Las columnas se alinean igual que las alinea gofmt.

Algunas claves no se pueden asociar a un campo de un struct. Ninguna etiqueta json puede nombrar una clave vacía ni una clave que contenga una coma, unas comillas o una barra invertida. El encoding/json original también ignora un nombre de etiqueta que contenga algo distinto de letras, dígitos y signos de puntuación habituales, así que una clave con una marca combinable o un emoji solo la reconoce la implementación basada en encoding/json/v2. Cuando la muestra tiene claves así, la herramienta las enumera debajo de la salida.

La salida en TypeScript y JSON Schema

En TypeScript, una clave opcional se escribe con ?:, un valor anulable con | null, y una clave que no es un identificador válido va entre comillas. Las fechas con hora se tipan como string, porque es lo que devuelve JSON.parse, con un comentario que las señala. La forma con interface y la forma con alias de tipo describen la misma estructura; elige la que use tu código.

La salida en JSON Schema sigue el borrador 2020-12. Las claves presentes en todas las muestras se enumeran en required, los enteros son integer, las fechas con hora llevan format: date-time, y los tipos de objeto con nombre se colocan en $defs y se referencian con $ref.

Una muestra enseña cómo era un documento, no todo lo que una API puede enviar. Comprueba los campos opcionales y anulables con la documentación de la API antes de fiarte del resultado.

Preguntas

¿Cómo sabe la herramienta que un campo es opcional?

Solo puede saberlo a partir de los arrays. Cuando los objetos de un array no tienen todos las mismas claves, una clave que falta en al menos uno de ellos es opcional. Un objeto suelto no da ninguna pista, así que todas sus claves se tratan como obligatorias.

¿Por qué un número es int y otro float64?

Un número se tipa como entero cuando todas sus muestras están escritas sin punto decimal ni exponente y caben en un entero de 64 bits. En Go es int, o int64 cuando una muestra queda fuera del rango de 32 bits. Si una sola muestra es 2.5, o está escrita como 1.0, el campo pasa a ser float64 en Go y number en JSON Schema. TypeScript usa number para todos.

¿Qué pasa cuando un valor es null?

Si el mismo campo tiene también una muestra que no es null, el tipo pasa a ser anulable: en Go, un puntero, o un slice o un map, que ya pueden ser nil; en TypeScript, una unión con null; en JSON Schema, un esquema que también acepta null. Si null es la única muestra, no se sabe nada del tipo real, así que el resultado es any en Go y null en TypeScript y en JSON Schema.

¿Se envía mi JSON a un servidor?

No. Los tipos se generan con JavaScript en la pestaña de tu navegador. La herramienta no hace ninguna petición de red con lo que pegas, y la política de seguridad del sitio bloquea las peticiones a cualquier otro host.

Más herramientas de Datos