W3docs

Introducción a Java JSON

Una visión general de las principales bibliotecas JSON disponibles para Java — Jackson, Gson, JSON-B y org.json.

Introducción a Java JSON

JSON (JavaScript Object Notation) es el formato más común para intercambiar datos en la web. Las API lo devuelven, los archivos de configuración lo usan y los servicios se lo pasan entre sí. Java no tiene soporte de JSON integrado en el núcleo del JDK, así que trabajar con JSON significa elegir una biblioteca — pero los conceptos de análisis, mapeo y serialización siguen siendo los mismos sea cual sea la que elija.

Qué es JSON

JSON es un formato ligero, basado en texto, para datos estructurados. Está construido a partir de unos pocos tipos simples: cadenas, números, booleanos, null, arreglos (listas ordenadas) y objetos (mapas clave/valor). Como es texto plano, cualquier lenguaje puede leerlo y escribirlo, y por eso se convirtió en la lingua franca de las API web.

{
  "name": "Ann",
  "age": 30,
  "admin": true,
  "roles": ["editor", "author"],
  "address": null
}

El formato se mapea limpiamente sobre los tipos de los lenguajes de programación. En Java, un objeto JSON se convierte en un Map o una clase personalizada, un arreglo se convierte en una List o un arreglo, y los tipos escalares se convierten en String, Number, Boolean y null.

Tipo JSONEquivalente en Java
objectMap<String, Object> o un POJO/record
arrayList<?> o T[]
stringString
numberint, long, double, BigDecimal
true / falseboolean / Boolean
nullnull

Por qué importa JSON

JSON es la carga útil predeterminada de las API REST, y los programas Java lo envían y reciben constantemente: un servicio web lee un cuerpo de solicitud JSON, consulta una base de datos y escribe una respuesta JSON. También es legible por humanos, por lo que sirve además como formato de configuración y de registro.

Comparado con XML — el formato de intercambio más antiguo que JSON desplazó en gran medida — JSON es más escueto, tiene menos ceremonia y se mapea más directamente sobre las estructuras de datos del lenguaje. XML sigue ganando donde se necesitan esquemas, espacios de nombres o contenido mixto, pero para el simple intercambio de datos JSON suele ser la opción más ligera.

Las principales bibliotecas de Java

El JDK no incluye un analizador de JSON, así que usted añade uno. Tres bibliotecas dominan:

BibliotecaPunto fuerteUso típico
JacksonRápida, rica en funciones, streaming + bindingEl estándar de facto; integrada en Spring Boot
GsonAPI sencilla, huella pequeñaAndroid, scripts rápidos
JSON-P / JSON-B (Jakarta)Estándar oficial de Jakarta EEAplicaciones empresariales/Jakarta

Jackson es la más utilizada. Su clase central es ObjectMapper, que convierte entre texto JSON y objetos Java en una sola llamada:

import com.fasterxml.jackson.databind.ObjectMapper;

ObjectMapper mapper = new ObjectMapper();

// Objeto Java -> texto JSON (serializar)
String json = mapper.writeValueAsString(user);

// Texto JSON -> objeto Java (deserializar)
User parsed = mapper.readValue(json, User.class);

Gson sigue la misma forma con nombres distintos:

import com.google.gson.Gson;

Gson gson = new Gson();
String json = gson.toJson(user);          // serializar
User parsed = gson.fromJson(json, User.class); // deserializar

Añada la biblioteca como dependencia antes de usarla — para Jackson es com.fasterxml.jackson.core:jackson-databind; para Gson, com.google.code.gson:gson.

Dos formas de analizar: árbol vs. binding

Sea cual sea la biblioteca que elija, hay dos modelos principales para leer JSON:

  • El data binding mapea JSON directamente sobre clases Java. Usted define una clase (o record) cuyos campos coinciden con las claves, y la biblioteca la rellena. Es el enfoque más limpio cuando la estructura es conocida y estable.
  • El modelo de árbol/map analiza JSON en un árbol genérico de nodos (JsonNode en Jackson) o un Map<String, Object>. Usted navega por clave. Úselo cuando la forma es dinámica o solo necesita unos pocos campos.
// Binding: estructura conocida de antemano
record User(String name, int age, boolean admin) {}
User u = mapper.readValue(json, User.class);
System.out.println(u.name());

// Árbol: navegar sin clase
JsonNode root = mapper.readTree(json);
System.out.println(root.get("name").asText());

El binding le aporta seguridad de tipos y código legible; el modelo de árbol le aporta flexibilidad. La mayoría de las aplicaciones usan binding para sus propios objetos de dominio y recurren al modelo de árbol solo para datos poco estructurados.

Un ejemplo ejecutable

El entorno aislado no tiene ni Jackson ni Gson en el classpath, así que el programa siguiente usa solo colecciones del JDK para demostrar la misma idea: un objeto JSON analizado no es más que claves mapeadas sobre valores tipados, un arreglo es una List, y la serialización convierte esa estructura de vuelta en texto JSON. Los ejemplos estáticos de arriba muestran la verdadera API de biblioteca que usará en un proyecto.

java— editable, runs on the server

Qué llevarse de la ejecución:

  • Un objeto JSON analizado se comporta como un Map: usted obtiene cada campo por su clave, exactamente como lo haría mapper.readTree(...).get("name") en Jackson.
  • Los valores JSON conservan su tipo — age vuelve como un Number y admin como un Boolean, no como texto en bruto, por lo que age instanceof Number imprime true.
  • Un arreglo JSON se mapea sobre una List, así que roles es iterable e informa un tamaño de 2.
  • La serialización es lo inverso del análisis: recorrer la misma estructura reconstruye el texto JSON compacto {"name":"Ann",...}.
  • Usar LinkedHashMap preserva el orden de inserción, así que las claves serializadas aparecen en el orden en que se añadieron — útil para una salida estable y amigable con los diffs.

Práctica

Práctica

¿Sobre qué se mapea un arreglo JSON de la forma más natural en Java?