Эквивалент Gson Джексону @JsonInclude (JsonInclude.Include.NON_NULL)
На самом деле это продолжение этого вопроса. Воссоздать класс DTO без свойства поля вместо того, чтобы иметь его значение null, используя Gson / Jackson и Spring Boot . Первоначально я опубликовал его, пытаясь заставить его работать с Gson, но смог сделать это только с Джексоном, используя, @JsonInclude(JsonInclude.Include.NON_NULL)но не смог найти эквивалент для этого с Gson, поэтому я могу сохранить это как библиотеку для проекта.
Пробовал использовать @Expose (serialise = false, deserialise = false), где у меня была аннотация @JsonInclude, или установил для этого поля значение null, поскольку думал, что Gson по умолчанию проигнорирует это, но, похоже, он этого не делает.
Наконец, я попытался полностью удалить аннотацию @Expose, чтобы посмотреть, проигнорирует ли Gson это, но тоже не работает.
Вставьте сюда основные части проблемы, а также сохраните дополнительные детали, добавленные в исходный пост.
@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;
}
}
Если у кого-то есть другие идеи, как это сделать, пожалуйста. Большое спасибо.
Ответы
НЕ сериализуйте пустые поля (это стандартное поведение сериализации Gson)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.create();
System.out.println(gson.toJson(employeeObj));
Вывод:
{
"id": 1,
"firstName": "John",
"lastName": "Smith"
}
Сериализовать пустые поля (настраиваемая сериализация Gson с нулевыми значениями, включенными в вывод JSON)
Employee employeeObj = new Employee(1, "John", "Smith", null);
Gson gson = new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.create();
System.out.println(gson.toJson(employeeObj));
Вывод:
{
"id": 1,
"firstName": "John",
"lastName": "Smith",
"emailId": null
}
Кажется, что поведение по умолчанию для Gson не имело места, поскольку Spring Boot использует Jackson в качестве библиотеки сериализации по умолчанию. Замена этого путем вставки строки ниже в application.propertiesфайл устранила проблему для меня.
spring.mvc.converters.preferred-json-mapper=gson