Gson equivalente a Jackson @JsonInclude (JsonInclude.Include.NON_NULL)
Esto es en realidad un seguimiento de esta pregunta. Recrear la clase DTO sin la propiedad de campo en lugar de tenerla nula usando Gson / Jackson y Spring Boot . Originalmente lo publiqué tratando de que funcionara con Gson, pero solo pude hacerlo con Jackson usando el, @JsonInclude(JsonInclude.Include.NON_NULL)pero no he podido encontrar un equivalente para esto con Gson, así que puedo mantenerlo como la biblioteca para el proyecto.
Intenté usar @Expose (serialise = false, deserialise = false) donde tenía la anotación @JsonInclude o configuré ese campo en nulo como pensaba que Gson lo ignoraría por defecto, pero no parece hacerlo.
Finalmente, traté de eliminar la anotación @Expose por completo para ver si Gson lo ignoraría, pero tampoco funcionaba.
Pegando aquí las piezas principales del problema y manteniendo los detalles adicionales agregados a la publicación original.
@Service
public class CategoryQueryServiceImpl implements CategoryQueryService {
@Autowired
private CategoryRepository categoryRepository;
@Autowired
private ReportRepository reportRepository;
ObjectMapper mapper = new ObjectMapper();
@Override
public CategoryQueryDto getCategory(UUID id) throws JsonProcessingException {
if (categoryRepository.findById(id).isPresent()) {
Category category = categoryRepository.findById(id).get();
CategoryQueryDto categoryQueryDto = new CategoryQueryDto(category.getId(), category.getTitle());
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
String converter = gson.toJson(categoryQueryDto);
categoryQueryDto = gson.fromJson(converter, CategoryQueryDto.class);
// Jackson
//String converter = mapper.writeValueAsString(categoryQueryDto);
//categoryQueryDto = mapper.readValue(converter, CategoryQueryDto.class);
return categoryQueryDto;
} else {
return null;
}
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public class CategoryQueryDto {
@Expose()
private UUID id;
@Expose()
private String title;
// Jackson
// @JsonInclude(JsonInclude.Include.NON_NULL)
private List<ReportQueryDto> reports = null;
public CategoryQueryDto(UUID id, String title) {
this.id = id;
this.title = title;
}
}
Si alguien tiene otras ideas sobre cómo hacer esto, por favor. Muchas gracias.
Respuestas
NO serialice campos nulos (este es el comportamiento predeterminado de la serialización Gson)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
System.out.println(gson.toJson(employeeObj));
Salida:
{
"id": 1,
"firstName": "John",
"lastName": "Smith"
}
Serializar campos nulos (serialización Gson personalizada con valores nulos incluidos en la salida JSON)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.create();
System.out.println(gson.toJson(employeeObj));
Salida:
{
"id": 1,
"firstName": "John",
"lastName": "Smith",
"emailId": null
}
Parece que el comportamiento predeterminado de Gson no estaba ocurriendo ya que Spring Boot usa Jackson como la biblioteca de serialización predeterminada. Sobrescribir esto pegando la siguiente línea dentro del application.propertiesarchivo me solucionó el problema.
spring.mvc.converters.preferred-json-mapper=gson