Comment dire à Jackson d'ignorer un champ pendant la sérialisation si sa valeur est nulle?

Comment peut-on configurer Jackson pour ignorer une valeur de champ pendant la sérialisation si la valeur de ce champ est nulle.

par exemple:

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; 
}
564
demandé sur 0m3r 2012-08-01 14:40:31

15 réponses

pour supprimer les propriétés de sérialisation avec des valeurs nulles en utilisant Jackson >2.0, vous pouvez configurer le ObjectMapper directement , ou utiliser le @JsonInclude annotation:

mapper.setSerializationInclusion(Include.NON_NULL);

ou:

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

alternativement, vous pouvez utiliser @JsonInclude dans un getter de sorte que l'attribut serait affiché si la valeur n'est pas nulle.

Un exemple plus complet est disponible en ma réponse à Comment prévenir les valeurs null à l'intérieur d'une Carte et de champs null à l'intérieur d'un haricot de la prise en sérialisé par Jackson .

927
répondu Programmer Bruce 2018-03-01 16:40:38

Avec Jackson > 1.9.11 et < 2.x pour ce faire, utilisez @JsonSerialize annotation:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)

115
répondu WTK 2017-05-05 08:30:35

juste pour développer sur les autres réponses - si vous avez besoin de contrôler l'omission de valeurs nulles sur une base par champ, Annoter le champ en question (ou alternativement Annoter le 'getter'du champ).

exemple ici seulement fieldOne sera oublié de json si elle est nulle. fieldTwo sera toujours inclus, qu'il soit nul ou non.

public class Foo {

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

    private String fieldTwo;
}

pour omettre toutes les valeurs nulles dans la classe par défaut, annoter la classe. Les annotations Per-field/getter peuvent encore être utilisées pour outrepasser cette valeur par défaut si nécessaire.

exemple ici fieldOne et fieldTwo sera oublié de json si ils sont nuls, respectivement, parce que c'est la valeur par défaut définie par la classe d'annotation. fieldThree toutefois remplacer la valeur par défaut et sera toujours inclus, en raison de l'annotation sur le terrain.

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

    private String fieldOne;

    private String fieldTwo;

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

mise à JOUR

ci-dessus est pour Jackson 2 . Pour versions précédentes de Jackson vous devez utiliser:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL) 

au lieu de

@JsonInclude(JsonInclude.Include.NON_NULL)

si cette mise à jour est utile, veuillez upvote ZiglioUK la réponse ci-dessous, il a souligné la nouvelle annotation Jackson 2 bien avant que je mis à jour ma réponse pour l'utiliser!

99
répondu davnicwil 2018-08-19 09:18:41

Dans Jackson 2.x, utiliser:

@JsonInclude(JsonInclude.Include.NON_NULL)
55
répondu ZiglioUK 2016-12-30 04:24:31

vous pouvez utiliser la configuration mapper suivante:

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

depuis 2.5 vous pouvez utiliser:

mapper.setSerializationInclusion(Include.NON_NULL);
29
répondu Eren Yilmaz 2016-09-26 23:23:20

dans mon cas

@JsonInclude(Include.NON_EMPTY)

l'a fait marcher.

10
répondu alfthan 2015-04-24 19:07:07

vous pouvez définir application.properties :

spring.jackson.default-property-inclusion=non_null

ou application.yaml :

spring:
  jackson:
    default-property-inclusion: non_null

http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

9
répondu Yury 2018-08-05 22:07:55
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_EMPTY)

devrait marcher.

Include.NON_EMPTY indique que la propriété est sérialisé si sa valeur n'est pas nulle et non vide. Include.NON_NULL indique que la propriété est sérialisée si sa valeur n'est pas nulle.

6
répondu Neha Gangwar 2016-05-02 15:44:15

si vous voulez ajouter cette règle à tous les modèles dans Jackson 2.6 + utiliser:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
5
répondu Ilia Kurtov 2016-04-27 21:52:09

si dans Spring Boot , vous pouvez personnaliser le jackson ObjectMapper directement à travers les fichiers de propriétés.

exemple application.yml :

spring:
  jackson:
    default-property-inclusion: non_null # only include props if non-null

les valeurs possibles sont:

always|non_null|non_absent|non_default|non_empty

plus: https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper

4
répondu acdcjunior 2017-11-28 20:56:03

pour Jackson 2.5 utilisation:

@JsonInclude(content=Include.NON_NULL)
2
répondu Bilal BBB 2015-07-19 21:14:05

cela me préoccupe depuis un certain temps et j'ai finalement trouvé le problème. Le problème était dû à un mauvais importation. Plus tôt j'avais utilisé

com.fasterxml.jackson.databind.annotation.JsonSerialize

qui avait été déprécié. Il suffit de remplacer l'importation par

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

et l'utiliser comme

@JsonSerialize(include=Inclusion.NON_NULL)
1
répondu user3443646 2016-10-24 07:13:37

Si vous essayez de sérialiser une liste d'objet et l'un d'eux est nul, vous vous retrouverez notamment la rubrique nulle dans le json, même avec

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

résultera en:

[{myObject},null]

pour obtenir ceci:

[{myObject}]

on peut faire quelque chose comme:

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

conseil: si vous utilisez DropWizard vous pouvez récupérer L'ObjectMapper étant utilisé par Jersey en utilisant l'environnement.getObjectMapper ()

1
répondu user3474985 2017-11-23 06:42:35

configuration Globale si vous utilisez le Printemps

@Configuration
public class JsonConfigurations {

    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.serializationInclusion(JsonInclude.Include.NON_NULL);
        builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
        builder.failOnUnknownProperties(false);
        return builder;
    }

}
1
répondu Xelian 2018-01-22 20:57:34

Jackson 2.x+ utilisation

mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);
0
répondu mekdev 2015-07-16 16:02:27