JSON (JavaScript Object Notation) es una colección de pares de clave-valor que pueden ser fácilmente analizados y generados por aplicaciones. Es un subconjunto del Estándar de Lenguaje de Programación JavaScript ECMA-262. El análisis de JSON es necesario en la mayoría de las aplicaciones, como las APIs restful o aplicaciones que necesitan serialización de datos.
En el ecosistema Java, las dos bibliotecas más populares para manejar datos JSON son Jackson y Gson. Ambas son ampliamente utilizadas y ofrecen ventajas únicas. Este artículo utiliza ejemplos de casos extremos para explorar las características de ambas bibliotecas en diferentes parámetros.
Resumen Breve de Jackson y Gson
Jackson
Jackson fue desarrollado por FasterXML y se utiliza en aplicaciones empresariales y marcos de trabajo como Spring Boot. Ofrece análisis, serialización y deserialización de datos JSON. Las siguientes características hacen que esta biblioteca sea popular entre los desarrolladores:
- Jackson es la biblioteca de procesamiento JSON predeterminada en Spring Boot, lo que elimina la configuración manual en la mayoría de los casos.
- Facilita la deserialización de JSON en tipos genéricos utilizando TypeReference o JavaType.
- Proporciona diferentes anotaciones para personalizar el comportamiento de serialización y deserialización. Por ejemplo,
@JsonProperty(name)
hace que el mapeo entre la clave entrante y el campo real de Java POJO sea perfecto. - Ofrece un amplio y sólido soporte para el enlace de datos bidireccional (de JSON a POJO y viceversa), la API de transmisión (lee JSON en POJO) y el análisis del modelo de árbol (un mapa en memoria de objetos JSON).
- La biblioteca Jackson ofrece un alto rendimiento debido a la minimización de la sobrecarga de memoria y la optimización de la serialización/deserialización (de JSON a POJO y viceversa).
- Jackson admite módulos adicionales como el procesamiento de XML, YAML y mejoras específicas de Kotlin y Scala.
- Las anotaciones como
@JsonTypeInfo
y@JsonSubTypes
manejan tipos polimórficos. - Maneja campos faltantes o adicionales en los datos JSON debido a su compatibilidad hacia atrás y hacia adelante.
- Jackson proporciona soporte para objetos inmutables y clases con constructores, incluidos aquellos que utilizan patrones de constructores.
- La clase
ObjectMapper
es segura para subprocesos y, por lo tanto, permite un uso eficiente en aplicaciones multinúcleo.
Gson
Gson fue desarrollado por Google y diseñado para convertir JSON en objetos Java (POJO) y viceversa. Es simple e ideal para usar en aplicaciones más pequeñas que necesitan implementaciones rápidas. La biblioteca de código abierto ofrece las siguientes características clave:
- Gson tiene dependencias externas mínimas; por lo tanto, es fácil de integrar.
- Admite objetos anidados y tipos de datos complejos como listas, mapas y clases personalizadas.
- Puede deserializar JSON en colecciones genéricas como
List<T>
,Map<K,V>
utilizando TypeToken. - Las interfaces JsonSerializer y JsonDeserializer de la biblioteca Gson permiten implementaciones personalizadas.
- Los valores nulos se excluyen en la salida JSON de forma predeterminada y, si es necesario, los valores nulos se pueden incluir en la salida.
- Las anotaciones
@SerializedName
mapean claves JSON a campos Java con nombres diferentes. - Los objetos Gson son seguros para subprocesos y, por lo tanto, se pueden usar en aplicaciones multinúcleo.
- La clase GsonBuilder puede aplicar políticas de nomenclatura personalizadas para los campos. Por ejemplo,
FieldNamingPolicy.IDENTITY
es la política predeterminada, lo que significa que el nombre del campo no cambia.
Casos Especiales Considerados en Esta Comparación
Feature | Jackson | GSON |
---|---|---|
Campos Extra |
Ignorados de forma predeterminada, configurables. |
Ignorados de forma predeterminada. |
Valores Nulos |
Admite @JsonInclude. |
Requiere .serializeNulls(). |
Referencias circulares |
Compatible con @JsonIdentityInfo. |
No compatible directamente. |
Manipulación de datos |
Compatible con la API de fechas de Java 8 con módulos. |
Requiere adaptadores de tipo personalizados. |
Polimorfismo |
Incorporado con @JsonTypeInfo. |
Necesita lógica de deserialización personalizada. |
El JSON de entrada considerado para la comparación con las bibliotecas Jackson y Gson está presente en GitHub.
La representación de la clase modelo del JSON está en GitHub.
Implementación de Jackson
El JSON anterior se convierte en un objeto Java utilizando las bibliotecas Jackson a continuación:
<!-- Jackson START-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.18.2</version>
</dependency>
<!-- Jackson END-->
Clase main de análisis JSON utilizando la biblioteca Jackson:
public class JacksonJsonMain {
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
//Jackson Support for LocalDate using jackson-datatype-jsr310
mapper.registerModule(new JavaTimeModule());
//Configuration to ignore extra fields
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// Deserialize the JSON
EmployeeModelData employeeModelData = mapper.readValue(json, EmployeeModelData.class);
Employee employee=employeeModelData.getEmployee();
// display Json fields
System.out.println("Jackson Library parsing output");
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
System.out.println("Skills: " + employee.getSkills());
System.out.println("Team Members Count: " + employeeModelData.getTeamMembers().size());
}
}
La salida de la clase anterior es la siguiente:
Implementación de Gson
La dependencia de Gson utilizada para convertir el JSON anterior en un objeto Java es la siguiente:
<!--GSON START -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<!--GSON END -->
Análisis JSON utilizando la clase main de la biblioteca GSON:
public class GsonJsonMain {
public static void main(String[] args) {
Gson gson = new GsonBuilder()
.registerTypeAdapter(LocalDate.class, new LocalDateAdapter()) // Register LocalDate adapter
.serializeNulls() // Handle null values
.setPrettyPrinting() // Pretty print JSON
.create();
// Deserialize the JSON
EmployeeModelData data = gson.fromJson(json, EmployeeModelData.class);
// Print Employee information
System.out.println("GSON Library parsing output");
System.out.println("Employee Name: " + data.getEmployee().getName());
System.out.println("Department Name: " + data.getEmployee().getDepartment().getName());
System.out.println("Skills: " + data.getEmployee().getSkills());
System.out.println("Team Members Count: " + data.getTeamMembers().size());
}
}
La salida de la clase principal anterior es la siguiente:
¿Cuál debo elegir?
Jackson ofrece un alto rendimiento; por lo tanto, debe utilizarse cuando los proyectos impliquen estructuras de datos complejas o conjuntos de datos grandes, mientras que Gson debe utilizarse cuando hay conjuntos de datos más pequeños y la estructura de datos es simple.
Conclusión
Ambas bibliotecas pueden manejar eficazmente el conjunto de datos mencionado anteriormente y son excelentes para procesar el análisis de JSON en JAVA. La comparación mencionada anteriormente ayuda a elegir la biblioteca correcta según los requisitos del proyecto.
Los fragmentos de código mencionados anteriormente están disponibles en el repositorio de GitHub.
Una comparación detallada entre Jackson y Gson está disponible en Baeldung. La Documentación oficial de Jackson ofrece información detallada sobre las características y configuración de Jackson. De manera similar, la documentación oficial de Gson proporciona una guía detallada de implementación.
Source:
https://dzone.com/articles/jackson-vs-gson-edge-cases-json-parsing-java