Jackson @JsonInclude (JsonInclude.Include.NON_NULL) Gson eşdeğeri

Sep 28 2020

Bu aslında bu sorunun devamı niteliğindedir DTO sınıfını Gson / Jackson ve Spring Boot kullanarak null yapmak yerine alan özelliği olmadan yeniden oluşturun . Başlangıçta onu Gson ile çalışmasını sağlamaya çalışırken yayınladım, ancak bunu yalnızca Jackson ile yapabildim, ancak bunun @JsonInclude(JsonInclude.Include.NON_NULL)için Gson ile bir eşdeğerini bulamadım, bu yüzden onu proje için kitaplık olarak tutabilirim.

@Expose kullanılarak denendi (serialise = false, deserialise = false) burada @JsonInclude ek açıklamasına sahiptim veya bu alanı varsayılan olarak Gson'un bunu göz ardı edeceği için boş olarak ayarladım, ancak öyle görünmüyor.

Son olarak, Gson'un bunu görmezden gelip gelmeyeceğini, ancak çalışmayacağını görmek için @Expose açıklamasını tamamen kaldırmaya çalıştım.

Sorunun ana parçalarını buraya yapıştırmanın yanı sıra orijinal gönderiye eklenen ekstra ayrıntıları saklayın.

@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;
}

}

Bunun nasıl yapılacağına dair başka bir fikri olan varsa lütfen. Çok teşekkür ederim.

Yanıtlar

1 anuragsaxena Sep 28 2020 at 16:43

Boş alanları serileştirmeyin (Bu, Gson serileştirmenin varsayılan davranışıdır)

Employee employeeObj = new Employee(1, "John", "Smith", null);
                 
Gson gson = new GsonBuilder()
        .setPrettyPrinting()
        .create(); 
 
System.out.println(gson.toJson(employeeObj));

Çıktı:

{
  "id": 1,
  "firstName": "John",
  "lastName": "Smith"
}

Boş alanları serileştirme (JSON çıktısına dahil edilen null değerlerle özel Gson serileştirme)

Employee employeeObj = new Employee(1, "John", "Smith", null);
                 
Gson gson = new GsonBuilder()
        .setPrettyPrinting()
        .serializeNulls()
        .create(); 
 
System.out.println(gson.toJson(employeeObj));

Çıktı:

{
  "id": 1,
  "firstName": "John",
  "lastName": "Smith",
  "emailId": null
}
FrancislainyCampos Sep 29 2020 at 03:27

Spring Boot, Jackson'ı varsayılan serileştirme kitaplığı olarak kullandığından Gson için varsayılan davranış gerçekleşmiyor gibi görünüyor. Aşağıdaki satırı application.propertiesdosyanın içine yapıştırarak bunun üzerine yazmak benim için sorunu çözdü.

spring.mvc.converters.preferred-json-mapper=gson