JSON a Java

Genera clases Java POJO desde JSON

Prueba un ejemplo
Nombre de la clase raíz:

Entrada JSON

Salida Java

Se ejecuta localmente · Es seguro pegar secretos
Las clases Java aparecerán aquí…

¿Qué es la conversión de JSON a clase Java?

La conversión de JSON a clase Java toma un objeto JSON en bruto y genera definiciones de Plain Old Java Object (POJO) con campos privados, getters y setters. Java no tiene un sistema de tipos JSON incorporado, por lo que toda respuesta de API JSON, archivo de configuración o payload de mensajes necesita una clase correspondiente antes de poder trabajar con él de forma segura en cuanto a tipos. Librerías como Jackson y Gson mapean las claves JSON a campos Java mediante reflexión, pero requieren que las definiciones de clase existan primero.

Un POJO Java estándar para la deserialización de JSON declara un campo privado por cada clave JSON, un constructor sin argumentos y un par getter/setter por campo. Los objetos JSON anidados se convierten en clases separadas. Los arrays se convierten en campos List<T> con el import de java.util.List. Los tipos primitivos JSON se mapean a primitivos Java (int, double, boolean) o a sus tipos envolventes (Integer, Double, Boolean) cuando se usan en genéricos. Los valores null se mapean típicamente a Object o a un tipo de referencia que admita null.

Escribir estas definiciones de clase a mano es un trabajo repetitivo. Hay que leer cada clave JSON, determinar el tipo Java a partir del valor, convertir las convenciones de nombres de camelCase JSON a campos Java en camelCase, crear nombres de clase en PascalCase para los objetos anidados y añadir el boilerplate de getters y setters. Para un objeto JSON con 15 campos y 3 objetos anidados, eso implica escribir 4 clases, más de 30 métodos y mantener todo coherente. Un conversor hace esto en milisegundos.

¿Por qué usar un conversor de JSON a Java?

Crear POJOs Java desde JSON de forma manual implica inspeccionar cada campo, inferir tipos a partir de valores de ejemplo, escribir pares getter/setter y repetir el proceso para cada objeto anidado. Cuando el contrato de la API cambia, hay que actualizar todo a mano. Un conversor elimina ese trabajo mecánico.

Generación instantánea de POJOs
Pega tu JSON y obtén definiciones completas de clases Java en menos de un segundo. Los objetos anidados, las listas y los tipos primitivos se detectan y mapean automáticamente.
🔒
Procesamiento con privacidad garantizada
La conversión se ejecuta íntegramente en tu navegador con JavaScript. Tu JSON nunca sale de tu máquina. Las claves de API, los tokens y los datos de producción se mantienen privados.
📝
Inferencia de tipos correcta
Cada campo generado usa el tipo Java apropiado inferido del valor JSON: String, int, double, boolean, List<T> u Object para valores nulos. Los tipos envolventes se usan dentro de los genéricos.
📦
Sin instalación ni registro
Abre la página y pega tu JSON. No se necesita JDK, ni dependencias Maven, ni cuenta que crear. Funciona en cualquier dispositivo con un navegador.

Casos de uso de JSON a Java

Desarrollo de APIs con Spring Boot
Genera DTOs de solicitud y respuesta a partir de muestras JSON de la API. Pega la forma del payload esperado y obtén clases Java listas para las anotaciones @RequestBody y @ResponseBody en los controladores de Spring.
Desarrollo de aplicaciones Android
Crea clases de modelo para las respuestas de red de Retrofit o Volley. Pega el JSON que devuelve tu API backend y obtén POJOs compatibles con los conversores de Gson o Moshi.
Integración de microservicios
Define clases de mensajes tipadas para payloads JSON de Kafka, RabbitMQ o gRPC. Pega un mensaje de ejemplo y genera POJOs que documenten el contrato esperado entre servicios.
Migración de sistemas heredados
Convierte respuestas de APIs JSON en clases Java al envolver endpoints REST en un cliente tipado. Útil al migrar desde patrones Map<String, Object> con tipado débil hacia modelos de dominio apropiados.
QA y automatización de pruebas
Construye fixtures tipadas a partir de muestras de respuestas de API. Los ingenieros de QA pueden pegar respuestas JSON reales y generar definiciones POJO para usar en suites de pruebas con JUnit o TestNG con aserciones AssertJ.
Aprendizaje de patrones OOP en Java
Los estudiantes pueden pegar cualquier estructura JSON y ver cómo Java la representa con clases, campos, getters, setters y tipos anidados. El resultado hace que lo abstracto se vuelva concreto.

Mapeo de tipos JSON a Java

Cada valor JSON se mapea a un tipo Java específico. La tabla siguiente muestra cómo el conversor traduce cada tipo JSON a su equivalente en Java. La columna Alternativa muestra los tipos envolventes usados en contextos genéricos como List<T>, o las características más recientes de Java como Records.

Tipo JSONEjemploTipo JavaAlternativa
string"hello"StringString
number (integer)42intint / Integer
number (float)3.14doubledouble / Double
booleantruebooleanboolean / Boolean
nullnullObjectObject (or @Nullable String)
object{"k": "v"}NestedClassRecord (Java 16+)
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<Object>List<Object>

Referencia de anotaciones Java para JSON

Al deserializar JSON con Jackson o Gson, las anotaciones controlan cómo se mapean las claves JSON a los campos Java, cómo se gestionan los campos desconocidos y cómo se tratan los valores nulos. Esta referencia cubre las anotaciones que encontrarás con más frecuencia al trabajar con POJOs generados.

AnotaciónPropósitoLibrería
@JsonProperty("name")Maps a JSON key to a Java field with a different nameJackson
@SerializedName("name")Same as @JsonProperty, but for the Gson libraryGson
@JsonIgnorePropertiesIgnores unknown JSON keys during deserialization instead of failingJackson
@NullableMarks a field as accepting null values from JSON inputJSR 305 / JetBrains
@NotNullEnforces that a field must not be null, throws on violationBean Validation
@JsonFormat(pattern=...)Defines a date/time format for serialization and deserializationJackson

POJO vs Record vs Lombok

Java tiene tres enfoques habituales para definir estructuras tipadas que almacenen datos JSON. Cada uno encaja en un estilo de proyecto y versión de Java diferente. Los POJOs son el patrón tradicional con mayor compatibilidad. Los Records reducen el boilerplate para datos inmutables. Lombok genera getters, setters y constructores en tiempo de compilación mediante anotaciones.

POJO
Patrón Java tradicional. Compatible con Java 8+. Defines campos privados más métodos getter/setter. Control total sobre la mutabilidad y la lógica personalizada. Compatible con todas las librerías JSON (Jackson, Gson, Moshi). La opción estándar para Spring Boot, Android y bases de código empresariales.
Record (Java 16+)
Incorporado desde Java 16 (vista previa en 14). Sintaxis compacta: record User(int id, String name) genera constructor, accesores, equals, hashCode y toString. Las instancias son inmutables. Jackson admite records desde la versión 2.12. La mejor opción para value objects y DTOs donde no necesitas setters.
Lombok @Data
Procesador de anotaciones de terceros en tiempo de compilación. @Data genera getters, setters, equals, hashCode y toString. @Builder añade el patrón builder. Reduce el boilerplate a niveles cercanos a los Records manteniendo la mutabilidad. Requiere añadir Lombok a tu herramienta de construcción (Maven/Gradle) y al plugin del IDE.

Ejemplos de código

Estos ejemplos muestran cómo usar los POJOs Java generados con Jackson para la deserialización, cómo generar clases Java mediante programación desde JavaScript y Python, y cómo usar la herramienta CLI jsonschema2pojo para la generación en lote.

Java (Jackson deserialization)
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;

@JsonIgnoreProperties(ignoreUnknown = true)
public class User {
    private int id;
    private String name;
    private String email;
    private boolean active;
    private double score;
    private Address address;
    private List<String> tags;

    // getters and setters omitted for brevity

    public static void main(String[] args) throws Exception {
        String json = "{\"id\":1,\"name\":\"Alice\",\"email\":\"alice@example.com\",\"active\":true,\"score\":98.5,\"address\":{\"street\":\"123 Main St\",\"city\":\"Springfield\",\"zip\":\"12345\"},\"tags\":[\"admin\",\"user\"]}";
        ObjectMapper mapper = new ObjectMapper();
        User user = mapper.readValue(json, User.class);
        System.out.println(user.getName()); // -> Alice
    }
}

class Address {
    private String street;
    private String city;
    private String zip;
    // getters and setters
}
JavaScript (generate Java POJO from JSON)
// Minimal JSON-to-Java-POJO generator in JS
function jsonToJava(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "Object";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "boolean";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<Object>";
      const elem = infer(first, fieldName);
      const boxed = elem === "int" ? "Integer" : elem === "double" ? "Double" : elem === "boolean" ? "Boolean" : elem;
      return `List<${boxed}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "Object";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) => {
      const type = infer(v, k);
      return `    private ${type} ${k};`;
    });
    classes.push(`public class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToJava({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// public class User {
//     private int id;
//     private String name;
//     private List<Integer> scores;
// }
Python (generate Java classes from JSON)
import json

def json_to_java(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "Object"
        if isinstance(val, bool):
            return "boolean"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<Object>"
            elem = infer(val[0], name)
            boxed = {"int": "Integer", "double": "Double", "boolean": "Boolean"}.get(elem, elem)
            return f"List<{boxed}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "Object"

    def build(obj, cls):
        fields = [f"    private {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"public class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "tags": ["admin"]}')
print(json_to_java(data, "User"))
# public class User {
#     private int id;
#     private String name;
#     private List<String> tags;
# }
CLI (jsonschema2pojo)
# Install jsonschema2pojo (requires Java 8+)
# Download from https://github.com/joelittlejohn/jsonschema2pojo

# Generate POJOs from a JSON file
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style jackson2

# Generate with Gson annotations instead
jsonschema2pojo --source user.json --target src/main/java \
  --source-type json --annotation-style gson

# From a JSON string via stdin
echo '{"id": 1, "name": "Alice", "tags": ["admin"]}' | \
  jsonschema2pojo --source-type json --annotation-style jackson2 \
  --target src/main/java --target-package com.example.model

Preguntas frecuentes

¿Cuál es la diferencia entre un POJO y un Java Bean?
Un POJO (Plain Old Java Object) es cualquier clase Java simple sin dependencias de framework. Un Java Bean es un POJO que sigue convenciones específicas: un constructor sin argumentos, campos privados con getters y setters públicos, e implementa Serializable. Para el mapeo JSON, la mayoría de las librerías requieren las convenciones Bean (getters/setters) pero no requieren Serializable. Las clases generadas por esta herramienta siguen el patrón getter/setter de los Beans.
¿Qué librería JSON debo usar con los POJOs generados?
Jackson (com.fasterxml.jackson) es la librería JSON Java más utilizada y la opción por defecto en Spring Boot. Gson (com.google.gson) es popular en proyectos Android y tiene una API más sencilla. Moshi es una alternativa más reciente de Square, diseñada para la interoperabilidad con Kotlin. Las tres funcionan con POJOs estándar que tienen getters y setters.
¿Cómo gestiona el conversor los objetos JSON anidados?
Cada objeto anidado se convierte en una clase Java separada. Si un campo JSON llamado "address" contiene un objeto con las claves "street" y "city", el conversor crea una clase Address con esos campos y define el campo del padre como de tipo Address. Las estructuras con anidamiento profundo producen múltiples definiciones de clase.
¿Qué ocurre cuando un campo JSON es null?
Los campos nulos se tipan como Object porque el conversor no puede inferir el tipo deseado únicamente a partir de un valor nulo. En la práctica, reemplazarías Object con el tipo esperado (String, Integer, etc.) una vez que conozcas el contrato de la API. Si usas Jackson, los valores nulos se asignan a campos de tipo referencia por defecto sin errores.
¿Debo usar Java Records en lugar de POJOs para JSON?
Los Records funcionan bien para objetos de transferencia de datos inmutables donde no necesitas setters. Jackson admite records desde la versión 2.12, y Gson añadió soporte en versiones posteriores. Si tu proyecto ejecuta Java 16+ y tratas las respuestas de la API como datos de solo lectura, los Records reducen el boilerplate. Si necesitas mutabilidad o apuntas a Java 8/11, usa POJOs.
¿Cómo gestiono las claves JSON que no son identificadores Java válidos?
Claves JSON como "first-name" o "2nd_place" no son nombres de campo Java válidos. Usa @JsonProperty("first-name") en Jackson o @SerializedName("first-name") en Gson para mapear la clave JSON a un nombre de campo Java válido como firstName. El conversor convierte automáticamente los nombres de clave a campos Java en camelCase.
¿Puedo generar clases Java desde un JSON Schema en lugar de un ejemplo JSON?
Esta herramienta genera clases a partir de muestras de datos JSON. Para entrada de JSON Schema, usa el proyecto jsonschema2pojo (disponible como herramienta CLI, plugin de Maven y plugin de Gradle). Lee un archivo JSON Schema y produce clases Java anotadas con restricciones de validación, valores por defecto y documentación extraída de las descripciones del esquema.