Gson entspricht Jackson @JsonInclude (JsonInclude.Include.NON_NULL)
Dies ist eigentlich eine Folge dieser Frage. Erstellen Sie eine DTO-Klasse ohne Feldeigenschaft neu, anstatt sie mit Gson / Jackson und Spring Boot auf Null zu setzen . Ich habe es ursprünglich gepostet, um es mit Gson zum Laufen zu bringen, konnte es aber nur mit Jackson mithilfe von Gson tun, konnte aber mit Gson @JsonInclude(JsonInclude.Include.NON_NULL)kein Äquivalent dafür finden, sodass ich es als Bibliothek für das Projekt behalten kann.
Versucht mit @Expose (serialise = false, deserialise = false), wo ich die Annotation @JsonInclude hatte oder dieses Feld auf null gesetzt habe, da Gson dies standardmäßig ignorieren würde, aber es scheint es nicht zu tun.
Schließlich habe ich versucht, die @ Expose-Annotation vollständig zu entfernen, um zu sehen, ob Gson das ignorieren würde, aber auch nicht funktioniert.
Fügen Sie hier die Hauptteile der Ausgabe ein und behalten Sie die zusätzlichen Details bei, die dem ursprünglichen Beitrag hinzugefügt wurden.
@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;
}
}
Wenn jemand andere Ideen dazu hat, bitte. Vielen Dank.
Antworten
KEINE Nullfelder serialisieren (Dies ist das Standardverhalten der Gson-Serialisierung)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
System.out.println(gson.toJson(employeeObj));
Ausgabe:
{
"id": 1,
"firstName": "John",
"lastName": "Smith"
}
Nullfelder serialisieren (Benutzerdefinierte Gson-Serialisierung mit Nullwerten in der JSON-Ausgabe)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.create();
System.out.println(gson.toJson(employeeObj));
Ausgabe:
{
"id": 1,
"firstName": "John",
"lastName": "Smith",
"emailId": null
}
Es scheint, dass das Standardverhalten für Gson nicht stattgefunden hat, da Spring Boot Jackson als Standard-Serialisierungsbibliothek verwendet. Das Überschreiben durch Einfügen der folgenden Zeile in die application.propertiesDatei hat das Problem für mich behoben.
spring.mvc.converters.preferred-json-mapper=gson