Gson equivalente a Jackson @JsonInclude (JsonInclude.Include.NON_NULL)
Na verdade, isso é uma continuação para esta questão. Recrie a classe DTO sem propriedade de campo em vez de torná-la nula usando Gson / Jackson e Spring Boot . Eu originalmente postei tentando fazê-lo funcionar com Gson, mas só consegui fazer com Jackson usando o, @JsonInclude(JsonInclude.Include.NON_NULL)mas não consegui encontrar um equivalente para isso com Gson, então posso mantê-lo como a biblioteca do projeto.
Tentei usar @Expose (serialise = false, desserialise = false) onde tinha a anotação @JsonInclude ou defini esse campo como nulo, pois pensava que Gson por padrão iria ignorar isso, mas não parece fazer isso.
Finalmente, tentei remover a anotação @Expose completamente de para ver se Gson iria ignorar isso, mas também não estava funcionando.
Colando aqui as principais peças do fascículo e também mantendo os detalhes extras acrescentados à postagem 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;
}
}
Se alguém tiver outras idéias sobre como fazer isso, por favor. Muito obrigado.
Respostas
NÃO serialize campos nulos (este é o comportamento padrão da serialização Gson)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
System.out.println(gson.toJson(employeeObj));
Resultado:
{
"id": 1,
"firstName": "John",
"lastName": "Smith"
}
Serializar campos nulos (serialização Gson personalizada com valores nulos incluídos na saída JSON)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.create();
System.out.println(gson.toJson(employeeObj));
Resultado:
{
"id": 1,
"firstName": "John",
"lastName": "Smith",
"emailId": null
}
Parece que o comportamento padrão do Gson não estava ocorrendo, pois o Spring Boot usa Jackson como a biblioteca de serialização padrão. Substituir isso colando a linha abaixo no application.propertiesarquivo corrigiu o problema para mim.
spring.mvc.converters.preferred-json-mapper=gson