JSON a Clase Java

Pega un ejemplo de JSON y el generador emite una o más clases de Java con los tipos de campo correctos, getters, setters y anotaciones de la biblioteca JSON. Soporta Jackson (@JsonProperty), Gson (@SerializedName), y Lombok (@Data/@Builder) para un código más limpio. Los objetos anidados se convierten en clases internas o hermanas, dependiendo del diseño que elijas.

Cómo convertir JSON a Java

  1. 1

    Pega el JSON

    Una sola muestra es suficiente; múltiples muestras mejoran la detección de nulabilidad.

  2. 2

    Elige la biblioteca

    Jackson (el más común en Spring), Gson (Android y algunos proyectos heredados), o POJO simple sin anotaciones.

  3. 3

    Elige extras

    Lombok para getters/setters generados automáticamente, patrón de constructor, equals/hashCode. O déjalo simple.

  4. 4

    Elige estilo anidado

    Clases hermanas en el mismo archivo (las clases públicas de Java 17+ deben estar en archivos separados) o clases estáticas anidadas.

  5. 5

    Copia el código

    Inserta en tu proyecto. Los nombres de clase coinciden con las claves JSON; el paquete se establece según lo que configures.

Ejemplo de salida: Jackson + Lombok

Entrada:

{ "firstName": "Alice", "age": 30, "address": { "city": "Madrid" } }

Salida:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @JsonProperty("firstName")
    private String firstName;

    @JsonProperty("age")
    private int age;

    @JsonProperty("address")
    private Address address;
}

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    @JsonProperty("city")
    private String city;
}

Mapeo de tipos

JSON Tipo Java
cadena String
entero (≤ Integer.MAX) Integer / int
entero grande Long / BigInteger
decimal Double / BigDecimal
booleano Boolean / boolean
fecha ISO LocalDate (Jackson JSR-310)
fecha y hora ISO Instant / OffsetDateTime
null (con hermano no nulo) Tipo envoltorio (ej. Integer)
arreglo List<T>
objeto Clase anidada

Elegir entre tipos envoltorios y primitivos

  • Primitivo (int, long, boolean), no nulo, eficiente, sin auto-boxing.
  • Envoltorio (Integer, Long, Boolean), nulo, requerido si el campo puede estar ausente o ser nulo en JSON.

El generador predetermina a envoltorio para cualquier cosa considerada como nula, primitivo de lo contrario.

Jackson vs Gson

Característica Jackson Gson
Ubicuidad en Spring Sí, predeterminado No (necesita configuración)
Rendimiento Más rápido Más lento
Soporte de fecha JSR-310 A través de módulo extra A través de módulo extra
Polimorfismo @JsonTypeInfo RuntimeTypeAdapter
Tolerancia a comas finales No (por defecto)

Errores comunes

  • Usar tipos primitivos para campos nulos. int no puede ser nulo; Jackson lanzará un error si el JSON tiene "age": null. Usa Integer.
  • Faltan módulos de fecha. Jackson necesita jackson-datatype-jsr310 para Instant/LocalDate. Sin él, las fechas caen de vuelta a String o largos de época.
  • Compartir tipos envoltorios entre clases no relacionadas. Si dos formas JSON tienen un Address anidado, el generador crea dos clases Address. Renombra o unifica manualmente.
  • Olvidar @JsonIgnoreProperties(ignoreUnknown = true). Jackson estricto lanza errores en propiedades desconocidas; añade esta anotación (o configura globalmente) para una deserialización tolerante.

Preguntas frecuentes

Jackson en la mayoría de los casos, es el predeterminado de Spring, más rápido y tiene un soporte de polimorfismo más rico. Gson es más ligero y más conocido en Android, aunque los proyectos de Android utilizan cada vez más Moshi o kotlinx.serialization.

Lombok reduce mucho el código repetitivo (getters, setters, equals, hashCode, builder). Se usa ampliamente pero requiere el procesador de anotaciones de Lombok en tu construcción. Desactívalo si tu proyecto evita Lombok por razones de higiene de dependencias.

Los campos que son nulos en cualquier muestra observada se convierten en tipos envoltorios (Integer en lugar de int), por lo que pueden contener nulos. Jackson luego deserializa "age": null sin error. Añade @JsonInclude(Include.NON_NULL) para omitir nulos en la serialización.

Sí, si seleccionas “registro”. Los registros son concisos, inmutables y funcionan con Jackson 2.12+. Para proyectos de Spring Boot 3, los registros más la generación sin Lombok son la opción moderna.

Herramientas relacionadas

Herramienta disponible en otros idiomas