Gson setara dengan Jackson @JsonInclude(JsonInclude.Include.NON_NULL)

Ini sebenarnya merupakan tindak lanjut untuk pertanyaan ini Buat ulang kelas DTO tanpa properti bidang alih-alih menjadikannya null menggunakan Gson/Jackson dan Spring Boot. Saya awalnya mempostingnya untuk mencoba membuatnya berfungsi dengan Gson tetapi hanya dapat melakukannya dengan Jackson menggunakan @JsonInclude(JsonInclude.Include.NON_NULL) tetapi belum dapat menemukan padanannya untuk ini dengan Gson sehingga saya dapat menyimpannya sebagai perpustakaan untuk proyek tersebut.

Mencoba menggunakan @Expose(serialise=false, deserialise=false) di mana saya memiliki anotasi @JsonInclude atau menyetel bidang itu ke null karena Gson secara default akan mengabaikannya, tetapi sepertinya tidak berhasil.

Akhirnya, saya mencoba menghapus anotasi @Expose sepenuhnya untuk melihat apakah Gson akan mengabaikannya tetapi tidak berhasil juga.

Menempelkannya di sini bagian utama masalah serta menambahkan detail tambahan ke postingan asli.

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

}

Jika ada yang punya ide lain tentang cara melakukan ini, silakan. Terima kasih banyak.


person Francislainy Campos    schedule 28.09.2020    source sumber


Jawaban (2)


JANGAN membuat serial bidang null (Ini adalah perilaku default serialisasi Gson)

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

Keluaran:

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

Buat serial bidang null (serialisasi Gson khusus dengan nilai null yang disertakan dalam output JSON)

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

Keluaran:

{
  "id": 1,
  "firstName": "John",
  "lastName": "Smith",
  "emailId": null
}
person anurag saxena    schedule 28.09.2020
comment
Hai, terima kasih atas jawabannya. Memberi suara positif karena berguna untuk mencari tahu apa masalahnya karena perilaku default untuk Gson tidak terjadi dan harus menimpanya di dalam file .properties. - person Francislainy Campos; 29.09.2020

Tampaknya perilaku default untuk Gson tidak terjadi karena Spring Boot menggunakan Jackson sebagai perpustakaan serialisasi default. Menimpa ini dengan menempelkan baris di bawah ini dalam file application.properties telah memperbaiki masalah saya.

spring.mvc.converters.preferred-json-mapper=gson
person Francislainy Campos    schedule 29.09.2020