Gson equivalente a Jackson @JsonInclude (JsonInclude.Include.NON_NULL)
Questo è in realtà un seguito per questa domanda Ricrea la classe DTO senza la proprietà del campo invece di averla nulla usando Gson / Jackson e Spring Boot . Inizialmente l'ho pubblicato cercando di farlo funzionare con Gson, ma solo in grado di farlo con Jackson usando il @JsonInclude(JsonInclude.Include.NON_NULL)ma non sono stato in grado di trovare un equivalente per questo con Gson, quindi posso tenerlo come libreria per il progetto.
Ho provato a usare @Expose (serialise = false, deserialise = false) dove avevo l'annotazione @JsonInclude o impostato quel campo su null perché pensavo che Gson per impostazione predefinita lo ignorasse, ma non sembra farlo.
Infine, ho provato a rimuovere completamente l'annotazione @Expose da per vedere se Gson l'avrebbe ignorata ma non funzionava neanche.
Incollando qui i pezzi principali del numero e mantenendo i dettagli extra aggiunti al post originale.
@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 qualcuno ha altre idee su come farlo, per favore. Grazie mille.
Risposte
NON serializzare i campi nulli (questo è il comportamento predefinito della serializzazione Gson)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
System.out.println(gson.toJson(employeeObj));
Produzione:
{
"id": 1,
"firstName": "John",
"lastName": "Smith"
}
Serializza i campi nulli (serializzazione Gson personalizzata con valori nulli inclusi nell'output JSON)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.create();
System.out.println(gson.toJson(employeeObj));
Produzione:
{
"id": 1,
"firstName": "John",
"lastName": "Smith",
"emailId": null
}
Sembra che il comportamento predefinito per Gson non si stesse verificando poiché Spring Boot utilizza Jackson come libreria di serializzazione predefinita. Sovrascriverlo incollando la riga sottostante all'interno del application.propertiesfile ha risolto il problema per me.
spring.mvc.converters.preferred-json-mapper=gson