Gson équivalent à Jackson @JsonInclude (JsonInclude.Include.NON_NULL)

Sep 28 2020

Il s'agit en fait d'un suivi de cette question Recréez la classe DTO sans propriété de champ au lieu de l'avoir null à l'aide de Gson / Jackson et Spring Boot . Je l'ai initialement posté en essayant de le faire fonctionner avec Gson, mais je n'ai pu le faire qu'avec Jackson en utilisant le @JsonInclude(JsonInclude.Include.NON_NULL)mais je n'ai pas été en mesure de trouver un équivalent pour cela avec Gson afin que je puisse garder cela comme bibliothèque pour le projet.

J'ai essayé d'utiliser @Expose (serialise = false, deserialise = false) où j'avais l'annotation @JsonInclude ou définir ce champ sur null, car Gson l'ignorerait par défaut, mais il ne semble pas le faire.

Enfin, j'ai essayé de supprimer complètement l'annotation @Expose pour voir si Gson l'ignorerait mais ne fonctionnait pas non plus.

Collez-y ici les principaux éléments du numéro et gardez les détails supplémentaires ajoutés à l'article d'origine.

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

}

Si quelqu'un a d'autres idées sur la façon de procéder, veuillez. Merci beaucoup.

Réponses

1 anuragsaxena Sep 28 2020 at 16:43

NE PAS sérialiser les champs nuls (il s'agit du comportement par défaut de la sérialisation Gson)

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

Production:

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

Sérialiser les champs nuls (sérialisation Gson personnalisée avec des valeurs nulles incluses dans la sortie JSON)

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

Production:

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

Il semble que le comportement par défaut de Gson ne se produise pas car Spring Boot utilise Jackson comme bibliothèque de sérialisation par défaut. L'écrasement en collant la ligne ci-dessous dans le application.propertiesfichier a résolu le problème pour moi.

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