JSON usando Jackson en la implementación de API REST con Spring Boot

Cada vez que implementamos una API REST con Spring (Spring Boot) , nos encontramos con el requisito de excluir NULL en la respuesta JSON de la API. Además, puede haber un requisito para externalizar la activación/desactivación de esta característica: Excluir NULLS en la respuesta JSON , lo que permite que el consumidor de la API la personalice según sus necesidades.

En este artículo, resumimos el enfoque que se utilizó para implementar la externalización de ACTIVAR/DESACTIVAR la función mencionada anteriormente utilizando Jackson: una biblioteca basada en Java para serializar o asignar objetos de Java a JSON y viceversa.

Aproximaciones fallidas:

Inicialmente, probamos con los enfoques fácilmente disponibles de Spring Boot, que no tuvieron éxito, como:

  • Tener la propiedad spring.jackson.default-property-inclusion en application.properties . Esta propiedad toma valores como: always / non_null / non_absent / non_default / non_empty .
  • Ampliar la clase WebMvcConfigurationSupport y personalizar la configuración de Spring Boot, consulte a continuación.

Java

@Configuration
class WebMvcConfiguration extends WebMvcConfiguration{
    @Override
    protected void extendsMessageConverters
      (List<HttpMessageConverter<?>> converters)
    {
        for(HttpMessageConverter<?> converter: converters)
        {
            if(converter instnceof MappingJackson2HttpMessageConverter)
            {
                ObjectMapper mapper = 
                  ((MappingJackson2HttpMessageConverter)converter)
                  .getObjectMapper();
                mapper.setSerializationInclusion(Include.NON_NULL);
                }
            }
        }

Ahora, creando una instancia de org.springframework.http.converter.json.Jackson2ObjectMapperBuilderCustomizer , debajo del código dado es para su referencia.

Java

@Bean
Public Jackson2ObjectMapperBuilderCustomizer customJackson(){
    return new Jackson2ObjectMapperBuilderCustomizer(){
    @Override
    public void customize(Jackson2ObjectMapperBuilder builder){
        builder.serializationInclusion(Include.NON_NULL);
        builder.failonUnknownProperties(false);
        }
    };
}

Enfoque exitoso:

Cree un objeto de respuesta JSON, si no se creó. Este es el objeto que, mientras se serializa en JSON, desea la característica ‘ Excluir/Incluir campos nulos ‘ en función de la propiedad en application.properties . Puede ver debajo del objeto Respuesta para su referencia.

Java

public class RegistrationResponse{
  
    @JsonProperty("success")
    private Boolean success = null;
      
    @JsonProperty("message")
    private String message = null;
      
    @JsonProperty("data")
    private String data = null;
      
    @JsonProperty("error_code")
    private Integer errorCode = null;
      
    public RegistrationResponse success(Boolean success){
        this.success = success;
        return this;
        }
          
        @NotNull
        public Boolean isSuccess(){
            return success;
            }
        public void setSuccess(Boolean success){
            this.success = success;
        }
          
        public RegistrationResponse message(String message){
            this.message = message;
            return this;
            }
              
        @NotNull
        public String getMessage(){
            return message;
        }
          
        public void setMessage(String message){
            this.message = message;
        }

Cree una propiedad con el nombre ‘ config.response.json.format.exclude_null ‘ que puede tomar valores como ‘ true ‘ o ‘ false ‘. El valor ‘ verdadero ‘ significa excluir campos nulos en la respuesta JSON y el valor ‘ falso ‘ significa no excluir campos nulos. Además, vincule esta propiedad a una propiedad de nivel de clase para que se pueda leer el valor. El código proporcionado a continuación es para su referencia.

config.response.json.format.exclude_null = false
@Value("${config.response.json.format.exclude_null}")
private boolean toExcludeNull;

Implemente la lógica real para excluir nulos en función del valor de la propiedad global creando una instancia de com.fasterxml.jackson.databind.ObjectMapper .

  • Estableciendo la propiedad SerializationInclusion del mapeador creado en Include.NON_NULL si el valor de la propiedad global es verdadero, de lo contrario, configúrelo en Include.ALWAYS .
  • Serialice el objeto de respuesta a una string usando el asignador y devuelva la string. Asegúrese de manejar JsonProcessingException .

Veamos a continuación el fragmento de código real que se agregará al construir la respuesta JSON como parte de la implementación de la API.

Java

RegistrationResponse regResp = new RegistrationResponse();
  
regResp.setSuccess(true);
regResp.setErrorCode(null);
regResp.setData("testdata");
regResp.setMessage("success");
  
ObjectMapper mapper = new ObjectMapper()
mapper.enable(SerializationFeature.INDENT_OUTPUT);
  
if(toExcludeNull) mapper.setSerializationInclusion(Include.NON_NULL);
else mapper.serializationInclusion(Include.ALWAYS);
  
String regRespStr = null;
try{
  
    regRespStr = mapper.writeValueAsString(regResp);
    }
    catch(JsonProcessingException e)
        e.printStackTrace();
        }
    System.out.println("Formatted JSON Response:" + regRespStr);

Aquí, regRespStr es la string JSON con exclusión/inclusión NULL aplicada.

También puedes consultar el Repositorio de Github .

Publicación traducida automáticamente

Artículo escrito por mail2praveensunks y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *