java - Come dire a Jackson di ignorare un campo durante la serializzazione se il suo valore è nullo?


Come può essere configurato Jackson per ignorare un valore di campo durante la serializzazione se il valore di quel campo è nullo.

Per esempio:

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



Per sopprimere la serializzazione delle proprietà con valori null, è possibile configurare direttamente ObjectMapper o utilizzare l'annotazione @JsonInclude :

mapper.setSerializationInclusion(Include.NON_NULL);

o:

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

In alternativa, è possibile utilizzare @JsonInclude in un getter in modo che l'attributo venga visualizzato se il valore non è null.

Un esempio più completo è disponibile nella mia risposta a Come impedire che valori nulli all'interno di una mappa e campi null all'interno di un bean vengano serializzati attraverso Jackson .




Con Jackson> 1.9.11 e <2.x usa @JsonSerialize annotazione @JsonSerialize per farlo:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)




Solo per espandere le altre risposte - se è necessario controllare l'omissione di valori nulli su base per campo, annotare il campo in questione (o in alternativa annotare il 'getter' del campo).

esempio - qui solo fieldOne verrà omesso da json se è nullo. fieldTwo sarà sempre incluso indipendentemente da se è nullo.

public class Foo {

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

    private String fieldTwo;
}

Per omettere tutti i valori nulli nella classe come predefiniti, annotare la classe. Le annotazioni per campo / getter possono ancora essere utilizzate per sovrascrivere questo valore predefinito se necessario.

esempio - qui fieldOne e fieldTwo verranno omessi da json se sono nulli, rispettivamente, poiché questo è il valore predefinito impostato dall'annotazione della classe. fieldThree tuttavia sovrascriverà il valore predefinito e sarà sempre incluso, a causa dell'annotazione sul campo.

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

    private String fieldOne;

    private String fieldTwo;

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

AGGIORNATO per usare Jackson 2 - per le versioni precedenti di Jackson

@JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS) 

invece di

@JsonInclude(JsonInclude.Include.NON_NULL)

Se questo aggiornamento è utile, si prega di aggiornare la risposta di ZiglioUK qui sotto, ha sottolineato questa annotazione più recente molto prima di questo aggiornamento!




In Jackson 2.x, utilizzare:

@JsonInclude(JsonInclude.Include.NON_NULL)



È possibile utilizzare la seguente configurazione del mapper:

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

Dal 2.5 puoi usare:

mapper.setSerializationInclusion(Include.NON_NULL);



nel mio caso

@JsonInclude(Include.NON_EMPTY)

ha funzionato




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

dovrebbe funzionare.

Include.NON_EMPTY indica che la proprietà è serializzata se il suo valore non è nullo e non è vuoto. Include.NON_NULL indica che la proprietà è serializzata se il suo valore non è nullo.




Se si desidera aggiungere questa regola a tutti i modelli in uso con Jackson 2.6+:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);



Per Jackson 2.5 utilizzare:

@JsonInclude(content=Include.NON_NULL)






Questo mi ha turbato per un bel po 'di tempo e alla fine ho trovato il problema. Il problema era dovuto a un'importazione errata. Prima stavo usando

com.fasterxml.jackson.databind.annotation.JsonSerialize

Che era stato deprecato. Basta sostituire l'importazione con

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

e usarlo come

@JsonSerialize(include=Inclusion.NON_NULL)



Jackson 2.x + usa

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



Se stai cercando di serializzare un elenco di oggetti e uno di essi è nullo, finirai per includere l'elemento nullo in JSON anche con

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

risulterà in:

[{MyObject}, null]

per ottenere questo:

[{MyObject}]

si può fare qualcosa come:

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

SUGGERIMENTO: se si utilizza DropWizard, è possibile recuperare ObjectMapper utilizzato da Jersey utilizzando environment.getObjectMapper ()