2013-01-21 1 views
10

In Jackson, è possibile utilizzare l'annotazione JsonSerialize su un POJO per impedire la serializzazione di oggetti nulli (@JsonSerialize (include = JsonSerialize.Inclusion.NON_NULL)). Primitive, tuttavia, non possono essere impostate su null, quindi questa annotazione non funziona per qualcosa di simile a un int che non è stato toccato e il valore predefinito è 0.Come faccio a rendere le serie di primitive non serializzate con il valore predefinito

C'è un'annotazione che mi consenta di dire qualcosa del tipo " Per questa classe, non serializzare le primitive a meno che non siano diverse dai loro valori predefiniti "o" Per questo campo, non serializzarlo se il suo valore è X "?

+0

Hai pensato di usare un serializzatore personalizzato? Non sei sicuro di come funzioni con i primitivi, ma almeno dai un'occhiata. – atomman

+0

Questa era la risposta che speravo di non sentire =). Finora tutto ha funzionato molto bene con l'installazione di vanilla e le annotazioni JsonProperty, JsonIgnore e JsonFilter. Lo controllerò comunque, grazie. – galactoise

risposta

20

Se si' usando una versione recente di Jackson puoi usare JsonInclude.Include.NON_DEFAULT che dovrebbe funzionare per le primitive.

L'aspetto negativo di questo approccio è che l'impostazione di una proprietà di fagioli al suo valore di default non avrà alcun effetto e la proprietà ancora non saranno inclusi:

@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

Questo è esattamente quello che stavo cercando! Quanto deve essere recente la mia versione? – galactoise

+0

Controlla il tuo 'JsonSerialize.Inclusion' o' JsonInclude.Include' (se si utilizza Jackson 2.x) enum per un 'opzione NON_DEFAULT', sembra come se fosse stato più a lungo di quanto pensassi – HiJon89

3

Il fatto è che in Java il caricatore di classe sarà impostata al valore di default tutte le proprietà non inizializzate primitivi (int = 0, Boolean = false, ecc ...), in modo non è possibile distinguere da quelli previsti esplicitamente dal la tua app. A mio parere ci sono due opzioni:

  • Usa corrispondente oggetti wrapper invece di primitivi (Integer, booleani, lungo ..)
  • come già suggerito, definire un serializzatore personalizzato