W jaki sposób Jackson można skonfigurować tak, aby ignorował wartość pola podczas serializacji, jeśli wartość tego pola jest równa null.
Na przykład:
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)
:; jakoś twoja adnotacja nie była dostępna.@JsonInclude
notacja nie działa, ale działa to jak urok:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
(Używam Jacksona 1.9.12 z wiosną 3.2.2.)@JsonSerialize
składni na@JsonInclude
. Starsza składnia jest przestarzała.W przypadku Jackson> 1.9.11 i <2.x użyj
@JsonSerialize
adnotacji, aby to zrobić:@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
źródło
@JsonSerialize(using = FooSerializer.class, include = JsonSerialize.Inclusion.NON_NULL)
nie działa wartości zerowe są serializowane.Aby rozwinąć inne odpowiedzi - jeśli chcesz kontrolować pomijanie wartości pustych dla poszczególnych pól, dodaj adnotację do danego pola (lub alternatywnie adnotację „getter” pola).
przykład - tutaj
fieldOne
zostanie odrzucony z json tylko, jeśli jest pusty.fieldTwo
zawsze będzie uwzględniony, niezależnie od tego, czy jest pusty.Aby domyślnie pominąć wszystkie wartości null w klasie, należy opisać klasę. W razie potrzeby można nadal używać adnotacji dla pól / getterów.
przykład - tutaj
fieldOne
ifieldTwo
zostaną odrzucone z json, jeśli są odpowiednio null, ponieważ jest to ustawienie domyślne ustawione przez adnotację klasy.fieldThree
zastąpi to ustawienie domyślne i zawsze zostanie uwzględnione, z uwagi na adnotację w polu.AKTUALIZACJA
Powyższe dotyczy Jackson 2 . W przypadku wcześniejszych wersji Jacksona musisz użyć:
zamiast
Jeśli ta aktualizacja jest przydatna, proszę głosować za odpowiedzią ZiglioUK poniżej, wskazywała ona na nowszą adnotację Jackson 2 na długo przed zaktualizowaniem mojej odpowiedzi, aby z niej skorzystać!
źródło
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
jest przestarzałaW Jackson 2.x użyj:
źródło
com.fasterxml.jackson.annotation
- Jackson 1.xorg.codehaus.jackson.annoation
Możesz użyć następującej konfiguracji mapowania:
Od wersji 2.5 możesz:
źródło
getSerializationConfig()
mówi: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);
Możesz ustawić
application.properties
:lub
application.yaml
:http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
źródło
w moim przypadku
sprawiło, że zadziałało.
źródło
{ }
wartości zerowej, która bez sensu przenosi idiom Java do konsumenta. to samo z AtomicReference - konsument nie dba o to, jak deweloper zdecydował się na bezpieczeństwo wątków na wewnętrznej reprezentacji odpowiedzi.powinno działać.
Include.NON_EMPTY
wskazuje, że właściwość jest serializowana, jeśli jej wartość nie jest równa null i nie jest pusta.Include.NON_NULL
wskazuje, że właściwość jest serializowana, jeśli jej wartość nie jest równa null.źródło
JsonInclude.Include.NON_EMPTY
- wystarczy, ponieważ dotyczy przypadku NOT_NULLJeśli chcesz dodać tę regułę do wszystkich modeli w Jackson 2.6+, użyj:
źródło
Jeśli w Spring Boot , możesz dostosować jackson
ObjectMapper
bezpośrednio poprzez pliki właściwości.Przykład
application.yml
:Możliwe wartości to:
Więcej informacji: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
źródło
Działa to w Spring boot 2.0.3+ i Jackson 2.0+
źródło
@JsonInclude(JsonInclude.Include.NON_NULL)
działało dla mnie w Spring Boot 2.1.2 i Jackson Adnotacje 2.9.0W przypadku Jackson 2.5 użyj:
źródło
Martwiło mnie to od dłuższego czasu i w końcu znalazłem problem. Przyczyną tego problemu był niewłaściwy import. Wcześniej używałem
Który był przestarzały. Po prostu zastąp import przez
i użyj go jako
źródło
Konfiguracja globalna, jeśli korzystasz z Spring
źródło
public Jackson2ObjectMapperBuilder serializationInclusion(JsonInclude.Include serializationInclusion) { this.serializationInclusion = serializationInclusion; return this; }
; Należy zastosować większy promień wyliczenia włączenia. np. NON_ABSENT obejmuje NON_NULL, a NON_EMPTY obejmuje oba. Tak więc powinien to byćbuilder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
tylko dokumentJeśli próbujesz serializować listę obiektów, a jeden z nich ma wartość NULL, skończysz, włączając element NULL w JSON, nawet jeśli
spowoduje:
aby to uzyskać:
można zrobić coś takiego:
WSKAZÓWKA: Jeśli korzystasz z DropWizard, możesz odzyskać dane
ObjectMapper
używane przez Jersey za pomocąenvironment.getObjectMapper()
źródło
Mamy wiele odpowiedzi na to pytanie. Ta odpowiedź może być pomocna w niektórych scenariuszach. Jeśli chcesz zignorować wartości zerowe, możesz użyć NOT_NULL na poziomie klasy. jak poniżej
Czasami może być konieczne zignorowanie pustych wartości, na przykład zainicjowanie tablicy tablicowej, ale na tej liście nie ma żadnych elementów. W tym czasie użycie adnotacji NOT_EMPTY w celu zignorowania pustych pól wartości
źródło
Jackson 2.x + użycie
źródło
.withSerializationInclusion(JsonInclude.Include.NON_NULL)
zamiast tego prawda?getSerializationConfig()
mówi: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.
Musisz także zmienić swoje podejście, używając Map myVariable zgodnie z opisem w dokumentacji, aby wyeliminować wartości null:
źródło
Przypadek pierwszy
Przypadek drugi
Jeśli
someString
ma wartość null, zostanie zignorowany w obu przypadkach. JeślisomeString
jest „”, można to zignorować tylko w przypadku drugim.To samo dla
List = null
lubList.size() = 0
źródło