Jackson-Serialisierung Optional mit Nullwert für YAML

Aug 26 2020

Derzeit verwende ich die YAMLFactory , um die ObjectMapperzu serialisieren und zu deserialisieren Pojos <=> YAML, aber sie schreibt nullWerte in der Serialisierung, obwohl sie die üblichen Tricks versucht Jackson.

Das Kommentieren mit @JsonInclude(JsonInclude.Include.NON_NULL)auf Klassen- oder Feldebene hat keine Auswirkungen. Ich habe auch versucht, Klassen @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)ohne Auswirkungen zu kommentieren. Wie erreichen Sie dies mit dem YAMLFactory?

Ich habe eine ähnliche Frage gefunden, aber der Anwendungsfall scheint nicht der gleiche zu sein. Um klar zu sein, versuche ich, das Feld ganz wegzulassen.

Bearbeiten: Hier ist ein Beispiel (ich benutze auch Lombok)

@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class QueueProperties extends Properties {

    @JsonProperty("QueueName")
    private String queueName;

    @JsonProperty("RedrivePolicy")
    private RedrivePolicy redrivePolicy;

    public Optional<RedrivePolicy> getRedrivePolicy() {
        return Optional.ofNullable(redrivePolicy);
    }
}

wenn serialisiert:

Properties:
  QueueName: 471416d1-3643-4d5a-a033-65f22757dcaf-chargeback-paypal-ingestion-ingest_dispute
  RedrivePolicy: null

ObjectMapper-Konfiguration:

ObjectMapper mapper = new ObjectMapper(new YAMLFactory().enable(YAMLGenerator.Feature.MINIMIZE_QUOTES));                                                          
mapper.registerModule(new Jdk8Module());

Antworten

2 MichałZiober Aug 26 2020 at 04:20

getRedrivePolicyDie Getter-Methode gibt immer ein not-nullObjekt zurück, auf das Optionaljedoch verwiesen werden kann null. In diesem Fall sollten Sie emptyObjekte überspringen . Optionalmit nullgilt als leer und wir können JsonInclude.Include.NON_EMPTYes verwenden. Sie können @JsonInclude(JsonInclude.Include.NON_NULL)auf Klassenebene bleiben und NON_EMPTYnur für einen bestimmten Getter hinzufügen :

@JsonInclude(JsonInclude.Include.NON_EMPTY)
public Optional<Object> getRedrivePolicy() {
    return Optional.ofNullable(redrivePolicy);
}