¿Cómo configurar ObjectMapper para ignorar propiedades desconocidas en JSON en Java?

JavaBeginner
Practicar Ahora

Introducción

En el desarrollo con Java, trabajar con datos JSON es un requisito común. La clase ObjectMapper de la biblioteca Jackson es una herramienta poderosa para convertir entre objetos Java y JSON. Sin embargo, al procesar datos JSON, puede encontrar propiedades que no están definidas en sus clases Java. Esto puede causar excepciones durante la deserialización.

Este laboratorio le guiará a través de la configuración de ObjectMapper para ignorar propiedades desconocidas en los datos JSON. Aprenderá a manejar JSON de manera eficiente, haciendo que sus aplicaciones sean más robustas al tratar con fuentes de datos externas que pueden cambiar con el tiempo.

Comprensión de JSON y Conceptos Básicos de ObjectMapper

Antes de profundizar en cómo manejar propiedades desconocidas, primero entendamos qué es JSON y cómo usar el ObjectMapper de Jackson en Java.

¿Qué es JSON?

JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos que es fácil de leer y escribir para los humanos, y de analizar y generar para las máquinas. Consiste en pares clave-valor y se utiliza comúnmente para transmitir datos entre aplicaciones web y servidores.

Aquí hay un ejemplo simple de un objeto JSON:

{
  "name": "John Doe",
  "age": 30,
  "email": "john.doe@example.com"
}

Introducción a Jackson ObjectMapper

La biblioteca Jackson es una de las bibliotecas de procesamiento JSON más populares en Java. La clase ObjectMapper es el componente central de Jackson que proporciona la funcionalidad para convertir entre objetos Java y JSON.

Creemos una clase Java simple y usemos ObjectMapper para convertirla a y desde JSON.

Primero, cree una clase Person siguiendo estos pasos:

  1. Abra el WebIDE y navegue a la vista del explorador
  2. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/Person.java
  3. Agregue el siguiente código al archivo:
package com.labex.json;

public class Person {
    private String name;
    private int age;

    // Default constructor needed for Jackson
    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

Ahora, creemos una clase Java para demostrar cómo usar ObjectMapper:

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/ObjectMapperDemo.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class ObjectMapperDemo {
    public static void main(String[] args) {
        try {
            // Create a Person object
            Person person = new Person("John Doe", 30);

            // Create an ObjectMapper instance
            ObjectMapper objectMapper = new ObjectMapper();

            // Serialize Person object to JSON string
            String jsonString = objectMapper.writeValueAsString(person);
            System.out.println("Serialized to JSON: " + jsonString);

            // Deserialize JSON string back to Person object
            Person deserializedPerson = objectMapper.readValue(jsonString, Person.class);
            System.out.println("Deserialized from JSON: " + deserializedPerson);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Ahora, compilemos y ejecutemos esta clase:

  1. Abra una terminal en el WebIDE
  2. Navegue al directorio del proyecto si aún no está allí:
    cd ~/project
  3. Compile y ejecute la clase:
    mvn compile exec:java -Dexec.mainClass="com.labex.json.ObjectMapperDemo"

Debería ver una salida similar a la siguiente:

Serialized to JSON: {"name":"John Doe","age":30}
Deserialized from JSON: Person{name='John Doe', age=30}

Esto demuestra la funcionalidad básica de ObjectMapper:

  • Serialización: convertir objetos Java a cadenas JSON
  • Deserialización: convertir cadenas JSON de nuevo a objetos Java

En el siguiente paso, exploraremos qué sucede cuando el JSON contiene propiedades que no están definidas en nuestra clase Java y cómo manejarlas.

El Problema de las Propiedades Desconocidas

En el mundo real, los datos JSON a menudo evolucionan con el tiempo. Las APIs pueden agregar nuevos campos, o diferentes sistemas pueden incluir información adicional. Cuando recibe JSON con propiedades que no coinciden con su clase Java, el comportamiento predeterminado de Jackson es lanzar una excepción.

Veamos este problema en acción:

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/UnknownPropertiesDemo.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class UnknownPropertiesDemo {
    public static void main(String[] args) {
        try {
            // Create a JSON string with an extra property not in our Person class
            String jsonWithExtraProperty = "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"}";

            // Create an ObjectMapper instance
            ObjectMapper objectMapper = new ObjectMapper();

            System.out.println("Attempting to deserialize JSON with an extra 'email' property...");

            // Try to deserialize the JSON into a Person object
            Person person = objectMapper.readValue(jsonWithExtraProperty, Person.class);

            // This line won't be reached if an exception occurs
            System.out.println("Successfully deserialized: " + person);

        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
  1. Compile y ejecute esta clase:
    cd ~/project
    mvn compile exec:java -Dexec.mainClass="com.labex.json.UnknownPropertiesDemo"

Debería ver una salida de error similar a:

Attempting to deserialize JSON with an extra 'email' property...
Error occurred: Unrecognized field "email" (class com.labex.json.Person), not marked as ignorable (2 known properties: "name", "age"])

Este error ocurre porque nuestra clase Person no tiene una propiedad email, pero la cadena JSON sí la tiene. Por defecto, el ObjectMapper de Jackson lanza una excepción cuando encuentra propiedades que no reconoce.

En muchos escenarios del mundo real, queremos que nuestra aplicación sea más flexible y maneje tales situaciones con elegancia. Aquí es donde configurar ObjectMapper para ignorar propiedades desconocidas se vuelve útil.

Configuración de ObjectMapper para Ignorar Propiedades Desconocidas

Ahora que entendemos el problema, aprendamos cómo configurar ObjectMapper para ignorar las propiedades desconocidas en lugar de lanzar excepciones.

Hay dos formas principales de configurar ObjectMapper para ignorar propiedades desconocidas:

  1. Usando el método configure() con DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
  2. Usando anotaciones en sus clases Java

Implementemos ambos enfoques:

Método 1: Usando el método configure()

Este método configura la instancia de ObjectMapper para ignorar todas las propiedades desconocidas para todas las clases que se deserializan.

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/IgnoreUnknownDemo.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class IgnoreUnknownDemo {
    public static void main(String[] args) {
        try {
            // Create a JSON string with an extra property not in our Person class
            String jsonWithExtraProperty = "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"}";

            // Create an ObjectMapper instance
            ObjectMapper objectMapper = new ObjectMapper();

            // Configure ObjectMapper to ignore unknown properties
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

            System.out.println("Attempting to deserialize JSON with an extra 'email' property...");

            // Deserialize the JSON into a Person object
            Person person = objectMapper.readValue(jsonWithExtraProperty, Person.class);

            // This should now work without throwing an exception
            System.out.println("Successfully deserialized: " + person);

        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
  1. Compile y ejecute esta clase:
    cd ~/project
    mvn compile exec:java -Dexec.mainClass="com.labex.json.IgnoreUnknownDemo"

Debería ver una salida similar a:

Attempting to deserialize JSON with an extra 'email' property...
Successfully deserialized: Person{name='John Doe', age=30}

Observe que ahora la deserialización tiene éxito, y la propiedad email simplemente se ignora. Nuestra aplicación continúa funcionando a pesar de la propiedad extra en el JSON.

Método 2: Usando Anotaciones

Si desea un control más preciso, puede usar anotaciones de Jackson para especificar el comportamiento a nivel de clase.

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/PersonWithAnnotation.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class PersonWithAnnotation {
    private String name;
    private int age;

    // Default constructor needed for Jackson
    public PersonWithAnnotation() {
    }

    public PersonWithAnnotation(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "PersonWithAnnotation{name='" + name + "', age=" + age + "}";
    }
}
  1. Ahora cree una clase de demostración para probar este enfoque:
  2. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/AnnotationDemo.java
  3. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;

public class AnnotationDemo {
    public static void main(String[] args) {
        try {
            // Create a JSON string with an extra property
            String jsonWithExtraProperty = "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"}";

            // Create an ObjectMapper instance (no special configuration needed)
            ObjectMapper objectMapper = new ObjectMapper();

            System.out.println("Attempting to deserialize JSON with an extra 'email' property...");

            // Deserialize the JSON into a PersonWithAnnotation object
            PersonWithAnnotation person = objectMapper.readValue(jsonWithExtraProperty, PersonWithAnnotation.class);

            // This should work without throwing an exception
            System.out.println("Successfully deserialized: " + person);

        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
  1. Compile y ejecute esta clase:
    cd ~/project
    mvn compile exec:java -Dexec.mainClass="com.labex.json.AnnotationDemo"

Debería ver una salida similar a:

Attempting to deserialize JSON with an extra 'email' property...
Successfully deserialized: PersonWithAnnotation{name='John Doe', age=30}

La anotación @JsonIgnoreProperties(ignoreUnknown = true) le dice a Jackson que ignore cualquier propiedad desconocida al deserializar JSON en una instancia de esta clase. Este enfoque es más específico que configurar todo el ObjectMapper.

Aplicaciones Prácticas y Casos de Uso en el Mundo Real

Ahora que comprende cómo configurar ObjectMapper para ignorar propiedades desconocidas, exploremos algunas aplicaciones prácticas y escenarios del mundo real donde esta característica es útil.

1. Consumo de APIs de Terceros

Al integrarse con APIs externas, a menudo no tiene control sobre los cambios en su formato de respuesta. Al configurar ObjectMapper para ignorar propiedades desconocidas, su aplicación puede continuar funcionando incluso si la API agrega nuevos campos.

Creemos un ejemplo simple que simula el consumo de una API del clima:

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/WeatherData.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public class WeatherData {
    private String city;
    private double temperature;
    private int humidity;

    // Default constructor needed for Jackson
    public WeatherData() {
    }

    // Getters and setters
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public double getTemperature() {
        return temperature;
    }

    public void setTemperature(double temperature) {
        this.temperature = temperature;
    }

    public int getHumidity() {
        return humidity;
    }

    public void setHumidity(int humidity) {
        this.humidity = humidity;
    }

    @Override
    public String toString() {
        return "WeatherData{" +
                "city='" + city + '\'' +
                ", temperature=" + temperature +
                ", humidity=" + humidity +
                '}';
    }
}
  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/WeatherApiConsumer.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.databind.ObjectMapper;

public class WeatherApiConsumer {
    public static void main(String[] args) {
        try {
            // Create an ObjectMapper
            ObjectMapper objectMapper = new ObjectMapper();

            // Simulate an initial API response with just the basics
            String initialApiResponse = "{\"city\":\"New York\",\"temperature\":72.5,\"humidity\":65}";

            // Parse the response
            WeatherData weatherData = objectMapper.readValue(initialApiResponse, WeatherData.class);
            System.out.println("Initial weather data: " + weatherData);

            // Now simulate the API adding new fields in a future version
            String updatedApiResponse =
                "{\"city\":\"New York\",\"temperature\":72.5,\"humidity\":65," +
                "\"wind_speed\":10.2,\"pressure\":1013.25,\"forecast\":\"sunny\"}";

            // Parse the updated response with the same object model
            WeatherData updatedWeatherData = objectMapper.readValue(updatedApiResponse, WeatherData.class);
            System.out.println("Updated weather data (with ignored fields): " + updatedWeatherData);

            // Notice how our application continues to work without changes to our model

        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
  1. Compile y ejecute esta clase:
    cd ~/project
    mvn compile exec:java -Dexec.mainClass="com.labex.json.WeatherApiConsumer"

Debería ver una salida similar a:

Initial weather data: WeatherData{city='New York', temperature=72.5, humidity=65}
Updated weather data (with ignored fields): WeatherData{city='New York', temperature=72.5, humidity=65}

Observe cómo nuestra aplicación continúa funcionando con la respuesta de la API actualizada, incluso si contiene campos adicionales que nuestra clase WeatherData no define.

2. Manejo de Diferentes Versiones de API

Otro escenario común es cuando necesita admitir múltiples versiones de una API con el mismo código de cliente:

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/ApiVersionDemo.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ApiVersionDemo {
    public static void main(String[] args) {
        try {
            // Create an ObjectMapper that ignores unknown properties
            ObjectMapper objectMapper = new ObjectMapper();
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

            // API v1 response
            String apiV1Response = "{\"name\":\"John Doe\",\"age\":30}";

            // API v2 response with additional fields
            String apiV2Response =
                "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"," +
                "\"address\":\"123 Main St\",\"phone\":\"555-1234\"}";

            // We can use the same Person class for both versions
            System.out.println("Parsing API v1 response:");
            Person personV1 = objectMapper.readValue(apiV1Response, Person.class);
            System.out.println(personV1);

            System.out.println("\nParsing API v2 response with the same class:");
            Person personV2 = objectMapper.readValue(apiV2Response, Person.class);
            System.out.println(personV2);

            // Both work fine with our simple Person class

        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
  1. Compile y ejecute esta clase:
    cd ~/project
    mvn compile exec:java -Dexec.mainClass="com.labex.json.ApiVersionDemo"

Debería ver una salida similar a:

Parsing API v1 response:
Person{name='John Doe', age=30}

Parsing API v2 response with the same class:
Person{name='John Doe', age=30}

Este ejemplo demuestra cómo configurar ObjectMapper para ignorar propiedades desconocidas le permite manejar diferentes versiones de una API con las mismas clases Java, lo que hace que su código sea más mantenible y adaptable a los cambios.

Mejores Prácticas y Opciones de Configuración Adicionales

Ahora que comprende cómo configurar ObjectMapper para ignorar propiedades desconocidas, analicemos algunas mejores prácticas y opciones de configuración adicionales que pueden ser útiles en aplicaciones del mundo real.

Mejores Prácticas

1. Elija el Enfoque Correcto para su Aplicación

  • Configuración Global: Use objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) cuando desee que todas sus operaciones de deserialización ignoren las propiedades desconocidas.
  • Anotación a Nivel de Clase: Use @JsonIgnoreProperties(ignoreUnknown = true) cuando solo desee que clases específicas ignoren las propiedades desconocidas.

2. Considere el Manejo de Errores y el Registro (Logging)

Incluso al ignorar propiedades desconocidas, puede ser útil registrar cuándo se encuentran propiedades desconocidas, especialmente en entornos de desarrollo o prueba.

Creemos un ejemplo con manejo personalizado para propiedades desconocidas:

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/LoggingUnknownPropertiesDemo.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;

import java.io.IOException;

public class LoggingUnknownPropertiesDemo {
    public static void main(String[] args) {
        try {
            // Create a JSON string with an extra property
            String jsonWithExtraProperty =
                "{\"name\":\"John Doe\",\"age\":30,\"email\":\"john.doe@example.com\"}";

            // Create an ObjectMapper instance
            ObjectMapper objectMapper = new ObjectMapper();

            // Configure ObjectMapper to ignore unknown properties
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

            // Add a problem handler to log unknown properties
            objectMapper.addHandler(new DeserializationProblemHandler() {
                @Override
                public boolean handleUnknownProperty(DeserializationContext ctxt,
                                                     JsonParser p,
                                                     com.fasterxml.jackson.databind.JsonDeserializer<?> deserializer,
                                                     Object beanOrClass,
                                                     String propertyName) throws IOException {
                    System.out.println("WARNING: Unknown property '" + propertyName +
                                      "' found during deserialization of " +
                                      beanOrClass.getClass().getSimpleName());
                    // Skip the value and continue
                    p.skipChildren();
                    return true;
                }
            });

            // Deserialize the JSON into a Person object
            Person person = objectMapper.readValue(jsonWithExtraProperty, Person.class);

            System.out.println("Successfully deserialized: " + person);

        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
  1. Compile y ejecute esta clase:
    cd ~/project
    mvn compile exec:java -Dexec.mainClass="com.labex.json.LoggingUnknownPropertiesDemo"

Debería ver una salida similar a:

WARNING: Unknown property 'email' found during deserialization of Person
Successfully deserialized: Person{name='John Doe', age=30}

Este enfoque le permite ignorar las propiedades desconocidas mientras aún está al tanto de su presencia, lo que puede ser útil para fines de depuración o monitoreo.

Opciones de Configuración Adicionales

ObjectMapper de Jackson proporciona muchas otras opciones de configuración útiles. Aquí hay algunas que a menudo van de la mano con ignorar propiedades desconocidas:

  1. Cree un nuevo archivo en ~/project/src/main/java/com/labex/json/AdditionalConfigurationsDemo.java
  2. Agregue el siguiente código al archivo:
package com.labex.json;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class AdditionalConfigurationsDemo {
    public static void main(String[] args) {
        try {
            // Create a Person object
            Person person = new Person("John Doe", 30);

            // Create an ObjectMapper with various configurations
            ObjectMapper objectMapper = new ObjectMapper();

            // Ignore unknown properties during deserialization
            objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

            // Allow JSON with single quotes
            objectMapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);

            // Allow JSON with unquoted field names
            objectMapper.configure(com.fasterxml.jackson.core.JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

            // Format output JSON with indentation for better readability
            objectMapper.configure(SerializationFeature.INDENT_OUTPUT, true);

            // Serialize the Person object to JSON with pretty printing
            String jsonString = objectMapper.writeValueAsString(person);
            System.out.println("Formatted JSON:");
            System.out.println(jsonString);

            // Parse JSON with single quotes and unquoted field names
            String nonStandardJson = "{'name':'Jane Smith', age:25}";
            Person parsedPerson = objectMapper.readValue(nonStandardJson, Person.class);
            System.out.println("\nParsed from non-standard JSON: " + parsedPerson);

        } catch (Exception e) {
            System.out.println("Error occurred: " + e.getMessage());
        }
    }
}
  1. Compile y ejecute esta clase:
    cd ~/project
    mvn compile exec:java -Dexec.mainClass="com.labex.json.AdditionalConfigurationsDemo"

Debería ver una salida similar a:

Formatted JSON:
{
  "name" : "John Doe",
  "age" : 30
}

Parsed from non-standard JSON: Person{name='Jane Smith', age=25}

Este ejemplo demuestra varias opciones de configuración:

  • SerializationFeature.INDENT_OUTPUT: Hace que el JSON generado sea más legible con sangría
  • ALLOW_SINGLE_QUOTES: Permite JSON con comillas simples en lugar de comillas dobles
  • ALLOW_UNQUOTED_FIELD_NAMES: Permite nombres de campo sin comillas

Estas configuraciones adicionales pueden ser útiles en diferentes escenarios, como cuando se trabaja con JSON no estándar o cuando necesita que su salida JSON sea más legible para los humanos.

Resumen

En este laboratorio, aprendió a configurar ObjectMapper de Jackson para ignorar propiedades desconocidas en datos JSON, una habilidad fundamental para construir aplicaciones Java robustas que procesan JSON de fuentes externas.

Ha dominado:

  • Serialización y deserialización JSON básicas con ObjectMapper de Jackson
  • El problema de las propiedades desconocidas en JSON y por qué pueden causar excepciones
  • Dos enfoques para manejar propiedades desconocidas:
    • Configuración global con objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    • Anotación a nivel de clase con @JsonIgnoreProperties(ignoreUnknown = true)
  • Aplicaciones prácticas y casos de uso en el mundo real:
    • Consumo de APIs de terceros que pueden cambiar con el tiempo
    • Soporte de múltiples versiones de una API con el mismo código
  • Mejores prácticas y opciones de configuración adicionales:
    • Registro (logging) de propiedades desconocidas durante la deserialización
    • Configuración de ObjectMapper para diferentes formatos JSON y estilos de salida

Estas habilidades le ayudarán a construir aplicaciones Java más resilientes que pueden manejar con elegancia datos JSON de diversas fuentes, incluso cuando el formato de datos cambie o contenga propiedades inesperadas.

Para un aprendizaje adicional, explore otras anotaciones y características de Jackson que pueden ayudar con escenarios de procesamiento JSON más complejos, como serializadores y deserializadores personalizados, manejo de formato de fecha y manejo de tipos polimórficos.