Wie kann Jackson so konfiguriert werden, dass ein Feldwert während der Serialisierung ignoriert wird, wenn der Wert dieses Felds null ist?
Zum Beispiel:
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;
}
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
; Irgendwie war deine Anmerkung nicht verfügbar.@JsonInclude
Notation nicht funktioniert, aber das funktioniert wie ein Zauber:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
(Ich verwende Jackson 1.9.12 mit Spring 3.2.2.)@JsonSerialize
Syntax in geändert@JsonInclude
. Die ältere Syntax ist veraltet.Verwenden Sie bei Jackson> 1.9.11 und <2.x die
@JsonSerialize
Annotation, um dies zu tun:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
quelle
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)
funktioniert nicht Nullwerte werden serialisiert.Nur um die anderen Antworten zu erweitern: Wenn Sie das Auslassen von Nullwerten pro Feld steuern müssen, kommentieren Sie das betreffende Feld (oder alternativ den 'Getter' des Felds).
Beispiel - hier
fieldOne
wird nur von json ausgelassen, wenn es null ist.fieldTwo
wird immer eingeschlossen, unabhängig davon, ob es null ist.Kommentieren Sie die Klasse mit Anmerkungen, um standardmäßig alle Nullwerte in der Klasse wegzulassen. Anmerkungen pro Feld / Getter können weiterhin verwendet werden, um diese Standardeinstellung bei Bedarf zu überschreiben.
Beispiel - hier
fieldOne
undfieldTwo
wird von json ausgelassen, wenn sie jeweils null sind, da dies der Standard ist, der durch die Klassenanmerkung festgelegt wird.fieldThree
Der Standardwert wird jedoch überschrieben und aufgrund der Anmerkungen im Feld immer berücksichtigt.AKTUALISIEREN
Das obige ist für Jackson 2 . Für frühere Versionen von Jackson müssen Sie Folgendes verwenden:
anstatt
Wenn dieses Update nützlich ist, stimmen Sie bitte der Antwort von ZiglioUK unten zu. Es wurde auf die neuere Anmerkung zu Jackson 2 hingewiesen, lange bevor ich meine Antwort aktualisiert habe, um sie zu verwenden!
quelle
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
ist veraltetVerwenden Sie in Jackson 2.x:
quelle
com.fasterxml.jackson.annotation
- Jackson 1.x hatteorg.codehaus.jackson.annoation
Sie können die folgende Mapper-Konfiguration verwenden:
Seit 2.5 können Sie Benutzer:
quelle
getSerializationConfig()
sagt:Note that since instances are immutable, you can NOT change settings by accessing an instance and calling methods: this will simply create new instance of config object.
mapper.setSerializationInclusion(Include.NON_NULL);
Sie können einstellen
application.properties
:oder
application.yaml
:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
quelle
in meinem Fall
hat es funktioniert.
quelle
{ }
null erhalten, wodurch eine Java-Sprache sinnlos an den Verbraucher übertragen wird. Gleiches gilt für AtomicReference. Dem Verbraucher ist es egal, wie der Entwickler die Thread-Sicherheit für die interne Darstellung der Antwort erzwingt.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.quelle
JsonInclude.Include.NON_EMPTY
- ist genug, da es NOT_NULL Fall abdecktWenn Sie diese Regel allen Modellen in Jackson 2.6+ hinzufügen möchten, verwenden Sie:
quelle
In Spring Boot können Sie den Jackson
ObjectMapper
direkt über Eigenschaftendateien anpassen .Beispiel
application.yml
:Mögliche Werte sind:
Weitere Informationen : https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
quelle
Dies funktioniert in Spring Boot 2.0.3+ und Jackson 2.0+
quelle
@JsonInclude(JsonInclude.Include.NON_NULL)
funktionierte für mich auf Spring Boot 2.1.2 und Jackson Annotations 2.9.0Für Jackson 2.5 verwenden Sie:
quelle
Das hat mich schon seit einiger Zeit beunruhigt und ich habe das Problem endlich gefunden. Das Problem war auf einen falschen Import zurückzuführen. Früher hatte ich benutzt
Welches war veraltet. Ersetzen Sie einfach den Import durch
und benutze es als
quelle
Globale Konfiguration, wenn Sie Spring verwenden
quelle
public Jackson2ObjectMapperBuilder serializationInclusion(JsonInclude.Include serializationInclusion) { this.serializationInclusion = serializationInclusion; return this; }
;; Man sollte den größeren Radius der Einschlusszählung verwenden. Beispiel: NON_ABSENT enthält NON_NULL und NON_EMPTY enthält beide. Daher sollte es nurbuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
JacksonInclude doc seinWenn Sie versuchen, eine Liste von Objekten zu serialisieren und eines davon null ist, wird das Null-Element sogar mit in den JSON aufgenommen
wird darin enden, dass:
um dies zu bekommen:
man kann so etwas machen wie:
TIPP: Wenn Sie DropWizard verwenden, können Sie
ObjectMapper
das von Jersey verwendete abrufenenvironment.getObjectMapper()
quelle
Wir haben viele Antworten auf diese Frage. Diese Antwort kann in einigen Szenarien hilfreich sein. Wenn Sie die Nullwerte ignorieren möchten, können Sie NOT_NULL auf Klassenebene verwenden. wie nachstehend
Manchmal müssen Sie möglicherweise die leeren Werte ignorieren, z. B. wenn Sie die ArrayList initialisiert haben, aber diese Liste enthält keine Elemente. In dieser Zeit verwenden Sie die Annotation NOT_EMPTY, um diese leeren Wertefelder zu ignorieren
quelle
Jackson 2.x + verwenden
quelle
.withSerializationInclusion(JsonInclude.Include.NON_NULL)
stattdessen richtig?getSerializationConfig()
sagt:Note that since instances are immutable, you can NOT change settings by accessing an instance and calling methods: this will simply create new instance of config object.
Außerdem müssen Sie Ihren Ansatz ändern, wenn Sie Map myVariable verwenden, wie in der Dokumentation beschrieben, um Nullen zu beseitigen:
quelle
Fall eins
Fall zwei
Wenn
someString
null ist, wird es in beiden Fällen ignoriert. WennsomeString
"" ist, wird es nur in Fall zwei ignoriert.Das gleiche gilt für
List = null
oderList.size() = 0
quelle