2013-01-21 15 views
10

W Jackson, możliwe jest użycie adnotacji JsonSerialize na POJO w celu uniemożliwienia serializacji obiektów zerowych (@JsonSerialize (include = JsonSerialize.Inclusion.NON_NULL)). Jednak prymitywów nie można ustawić na null, więc ta adnotacja nie działa dla czegoś takiego jak int, które nie zostało dotknięte i domyślnie 0.Jak zrobić jackson nie serializować prymitywy z wartością domyślną

Czy istnieje adnotacja, która pozwoliłaby mi powiedzieć coś w stylu " W przypadku tej klasy nie należy przekształcać do postaci szeregowych, chyba że różnią się one od wartości domyślnych "lub" W przypadku tego pola nie należy przekształcać do postaci szeregowej, jeśli ma wartość X "?

+0

Czy można uznać za pomocą niestandardowego serializatora? Nie wiesz, jak to działa z prymitywami, ale przynajmniej spójrz na to. – atomman

+0

To była odpowiedź, którą miałem nadzieję nie usłyszeć =). Do tej pory wszystko działało naprawdę dobrze z ustawieniami wanilii i adnotacjami JsonProperty, JsonIgnore i JsonFilter. Sprawdzę to, dzięki. – galactoise

Odpowiedz

20

Jeśli” Ponownie używając najnowszej wersji Jackson, możesz użyć JsonInclude.Include.NON_DEFAULT, która powinna działać dla prymitywów.

Wadą tego podejścia jest to, że ustawienie właściwości fasoli na wartość domyślną będzie miał żadnego wpływu i właściwość nadal nie będzie obejmował:

@JsonInclude(Include.NON_DEFAULT) 
public class Bean { 
    private int val; 
    public int getVal() { return val; } 
    public void setVal(int val) { this.val = val; } 
} 

Bean b = new Bean(); 
b.setVal(0); 
new ObjectMapper().writeValueAsString(b); // "{}" 
+0

Dokładnie tego szukałem! Jak ostatnio musi być moja wersja? – galactoise

+0

Sprawdź, czy wyliczenie 'JsonSerialize.Inclusion' lub' JsonInclude.Include' (jeśli używasz wyrażeń 2.x) dla opcji 'NON_DEFAULT', wygląda na to, że trwało to dłużej niż myślałem – HiJon89

3

Faktem jest, że w Javie program ładujący klasy ustawi domyślną wartość, a nie zainicjowane właściwości pierwotne (int = 0, boolean = false itd.), Więc nie można ich odróżnić od tych jawnie określonych przez Twoja aplikacja. Moim zdaniem masz dwie opcje:

  • Korzystanie odpowiednie obiekty otoki zamiast prymitywów (Integer, Boolean, Długi ..)
  • Jak już sugeruje, definiować niestandardowe serializatora
Powiązane problemy