java - Wie kann ich Jackson anweisen, ein Feld während der Serialisierung zu ignorieren, wenn sein Wert null ist?


Wie kann Jackson konfiguriert werden, um einen Feldwert während der Serialisierung zu ignorieren, wenn der Wert dieses Felds null ist.

Beispielsweise:

public class SomeClass {
   // what jackson annotation causes jackson to skip over this value if it is null but will 
   // serialize it otherwise 
   private String someValue; 
}

Answers



Um Serialisierungseigenschaften mit Nullwerten zu unterdrücken, können Sie den ObjectMapper direkt konfigurieren oder die Annotation @JsonInclude :

mapper.setSerializationInclusion(Include.NON_NULL);

oder:

@JsonInclude(Include.NON_NULL)
class Foo
{
  String bar;
}

Alternativ könnten Sie @JsonInclude in einem Getter verwenden, damit das Attribut angezeigt wird, wenn der Wert nicht null ist.

Ein vollständigeres Beispiel ist in meiner Antwort auf Wie man verhindert, dass Nullwerte innerhalb einer Map und Nullfelder innerhalb einer Bean durch Jackson serialisiert werden, verfügbar.




Mit Jackson> 1.9.11 und <2.x verwenden @JsonSerialize Annotation @JsonSerialize :

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)




Nur, um die anderen Antworten zu erweitern - wenn Sie die Auslassung von Nullwerten auf einer Pro-Feld-Basis kontrollieren müssen, kommentieren Sie das fragliche Feld (oder kommentieren Sie alternativ den 'Getter' des Feldes).

Beispiel - hier wird nur fieldOne von json entfernt, wenn es null ist. fieldTwo wird immer eingeschlossen, unabhängig davon, ob es null ist.

public class Foo {

    @JsonInclude(JsonInclude.Include.NON_NULL) 
    private String fieldOne;

    private String fieldTwo;
}

Um alle NULL-Werte in der Klasse als Standard auszulassen, kommentieren Sie die Klasse. Per-field / getter-Annotationen können weiterhin verwendet werden, um diese Standardeinstellung bei Bedarf zu überschreiben.

Beispiel: Hier werden fieldOne und fieldTwo von json entfernt, wenn sie null sind. Dies ist der Standardwert, der von der Klassenannotation festgelegt wird. fieldThree überschreibt jedoch den Standardwert und wird aufgrund der Annotation auf dem Feld immer berücksichtigt.

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foo {

    private String fieldOne;

    private String fieldTwo;

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String fieldThree;
}

AKTUALISIERT , um Jackson 2 zu verwenden - für frühere Versionen von Jackson

@JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS) 

Anstatt von

@JsonInclude(JsonInclude.Include.NON_NULL)

Wenn dieses Update nützlich ist, bitte uploaden Sie unten die Antwort von ZiglioUK, es hat diese neue Anmerkung lange vor diesem Update aufgezeigt!




Verwenden Sie in Jackson 2.x:

@JsonInclude(JsonInclude.Include.NON_NULL)



Sie können die folgende Mapper-Konfiguration verwenden:

mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);

Seit 2.5 können Sie Benutzer:

mapper.setSerializationInclusion(Include.NON_NULL);



in meinem Fall

@JsonInclude(Include.NON_EMPTY)

hat es funktioniert.




@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)

sollte arbeiten.

Include.NON_EMPTY gibt an, dass die Eigenschaft serialisiert wird, wenn ihr Wert nicht null und nicht leer ist. Include.NON_NULL gibt an, dass die Eigenschaft serialisiert wird, wenn ihr Wert nicht null ist.




Wenn Sie diese Regel allen Modellen in Jackson 2.6+ hinzufügen möchten, verwenden Sie Folgendes:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);



Für Jackson 2.5 verwenden:

@JsonInclude(content=Include.NON_NULL)






Das beunruhigt mich seit einiger Zeit und ich fand das Problem. Das Problem war auf einen falschen Import zurückzuführen. Früher hatte ich

com.fasterxml.jackson.databind.annotation.JsonSerialize

Welches war veraltet. Ersetzen Sie einfach den Import durch

import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

und benutze es als

@JsonSerialize(include=Inclusion.NON_NULL)



Jackson 2.x + Verwendung

mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);



Wenn Sie versuchen, eine Liste von Objekten zu serialisieren und eine von ihnen ist null, werden Sie am Ende das Null-Element in der Json auch mit einschließen

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

wird darin enden, dass:

[{MeinObjekt}, null]

um das zu bekommen:

[{meinObjekt}]

man kann so etwas machen wie:

mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
        @Override
        public void serialize(Object obj, JsonGenerator jsonGen, SerializerProvider unused)
                throws IOException
        {
            //IGNORES NULL VALUES!
        }
    });

TIPP: Wenn Sie DropWizard verwenden, können Sie den von Jersey verwendeten ObjectMapper mit environment.getObjectMapper () abrufen