JSON a Estructura Go

Siguiente

Pega un ejemplo de JSON y obtén definiciones de estructuras Go que lo analicen limpiamente con encoding/json. Los campos son exportados (CamelCase), etiquetados con las claves JSON originales, promovidos a punteros cuando un valor podría ser nulo, y los objetos anidados obtienen sus propias declaraciones de estructura nombradas.

Cómo convertir JSON a estructura Go

  1. 1

    Pega el JSON

    Un solo ejemplo es suficiente. Múltiples ejemplos mejoran la inferencia de nulabilidad.

  2. 2

    Elige el nombre

    PascalCase para campos exportados es la convención de Go. Elige el estilo de abreviatura (`URL` vs `Url`, `ID` vs `Id`).

  3. 3

    Elige la estrategia opcional

    Usa punteros para campos anulables (lo más idiomático), o etiquetas `omitempty`.

  4. 4

    Copia las estructuras

    Una estructura raíz más las anidadas. Pega en un archivo `.go` y presiona `go build`.

Ejemplo de salida

Para:

{ "first_name": "Alice", "age": 30, "email": null, "tags": ["admin"] }

Salida:

type User struct {
    FirstName string   `json:"first_name"`
    Age       int      `json:"age"`
    Email     *string  `json:"email"`
    Tags      []string `json:"tags"`
}

Mapeo de tipos

Valor JSON Tipo Go
cadena string
entero int o int64
número (decimal) float64
booleano bool
null (con hermano no nulo) *T (puntero)
arreglo []T
objeto Estructura nombrada
arreglo mixto []interface{}

Idiomas de nombrado que sigue el generador

  • Inicialismos en mayúsculas: id -> ID, url -> URL, api_key -> APIKey. Esto coincide con el estilo recomendado de Go (y las reglas de go vet / staticcheck).
  • JSON en snake_case -> campos en PascalCase: first_name -> FirstName.
  • Acrónimos de una sola palabra preservados: IP se queda como IP, HTTP se queda como HTTP.
  • Etiqueta JSON: json:"first_name" mantiene la clave original para que la codificación funcione correctamente.

Campos opcionales: ¿puntero o omitempty?

Estrategia Usar cuando
Puntero (*T) Necesitas distinguir “ausente” de “valor cero”
omitempty Solo quieres omitir valores cero al serializar; deserializar almacena cero para los faltantes
Ninguno El campo siempre está presente y los valores cero son significativos

El generador usa por defecto puntero + omitempty para cualquier cosa considerada nula; ajusta según tu semántica.

Errores comunes

  • Usar int donde el entero JSON excede MaxInt32 en un objetivo de 32 bits. Usa int64 para valores grandes conocidos.
  • Serializar de vuelta y perder el orden de las claves. encoding/json emite claves en el orden de declaración de campo, no en el orden JSON original. Ordena manualmente si necesitas salida canónica.
  • Arrays de formas mixtas. []interface{} pierde la seguridad de tipo. Considera tipos de unión con un campo discriminador type en su lugar.
  • Olvidar omitempty en opcionales. Sin él, los campos opcionales se serializan como "foo": null en lugar de ser omitidos.

Preguntas frecuentes

Usa punteros cuando necesites distinguir “campo ausente” de “campo es cero”. Usa omitempty cuando el valor cero no es un valor de negocio legal ("", 0, false siempre significan “omitir esto”). Muchos equipos eligen uno y lo aplican consistentemente en toda la base de código.

Cada objeto anidado se convierte en una declaración de estructura nombrada separada (por ejemplo, User -> Address). Los tipos se incrustan en línea solo cuando la estructura anidada es pequeña y se usa una vez; de lo contrario, obtienes tipos limpios y reutilizables.

Sí. id se convierte en ID, url se convierte en URL, api_key se convierte en APIKey. Esto es lo que go vet espera y lo que la mayoría de las guías de estilo de Go recomiendan.

El generador emite estructuras simples con etiquetas estándar json:. Para implementaciones personalizadas de UnmarshalJSON (por ejemplo, para fechas en formatos no ISO), agrégalas manualmente después de la generación.

Herramientas relacionadas

Herramienta disponible en otros idiomas