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


Comment Jackson peut-il être configuré pour ignorer une valeur de champ pendant la sérialisation si la valeur de ce champ est null.

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; 
}


Answers



Pour supprimer les propriétés de sérialisation avec des valeurs nulles, vous pouvez configurer ObjectMapper directement ou utiliser l'annotation @JsonInclude :

mapper.setSerializationInclusion(Include.NON_NULL);

ou:

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

Alternativement, vous pouvez utiliser @JsonInclude dans un getter afin que l'attribut soit affiché si la valeur n'est pas nulle.

Un exemple plus complet est disponible dans ma réponse à Comment empêcher les valeurs nulles à l'intérieur d'une carte et les champs null à l'intérieur d'un bean d'être sérialisé via Jackson .




Avec Jackson> 1.9.11 et <2.x, utilisez l'annotation @JsonSerialize pour cela:

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)




Juste pour développer les autres réponses - si vous devez contrôler l'omission de valeurs nulles par champ, annoter le champ en question (ou bien annoter le 'getter' du champ).

exemple - ici seul fieldOne sera omis de json s'il est nul. fieldTwo sera toujours inclus indépendamment de si elle est nulle.

public class Foo {

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

    private String fieldTwo;
}

Pour omettre toutes les valeurs nulles de la classe par défaut, annotez la classe. Les annotations par champ / getter peuvent toujours être utilisées pour remplacer cette valeur par défaut si nécessaire.

exemple - ici fieldOne et fieldOne seront ignorés de json s'ils sont respectivement Null, car il s'agit de la valeur par défaut définie par l'annotation de classe. fieldThree remplacera cependant la valeur par défaut et sera toujours inclus, à cause de l'annotation sur le terrain.

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

    private String fieldOne;

    private String fieldTwo;

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

MISE À JOUR pour utiliser Jackson 2 - pour les versions antérieures de Jackson utilisent

@JsonSerialize(include=JsonSerialize.Inclusion.ALWAYS) 

au lieu de

@JsonInclude(JsonInclude.Include.NON_NULL)

Si cette mise à jour est utile, veuillez reporter la réponse de ZiglioUK ci-dessous, elle a indiqué cette nouvelle annotation bien avant cette mise à jour!




Dans Jackson 2.x, utilisez:

@JsonInclude(JsonInclude.Include.NON_NULL)



Vous pouvez utiliser la configuration de mappeur suivante:

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

Depuis 2.5 vous pouvez user:

mapper.setSerializationInclusion(Include.NON_NULL);



dans mon cas

@JsonInclude(Include.NON_EMPTY)

fait marcher ça.




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

devrait marcher.

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




Si vous voulez ajouter cette règle à tous les modèles de Jackson 2.6+, utilisez:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);



Pour Jackson 2.5, utilisez:

@JsonInclude(content=Include.NON_NULL)






Cela m'a troublé pendant un certain temps et j'ai finalement trouvé le problème. Le problème était dû à une mauvaise importation. Plus tôt j'avais utilisé

com.fasterxml.jackson.databind.annotation.JsonSerialize

Ce 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)



Jackson 2.x + utilisation

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



Si vous essayez de sérialiser une liste d'objets et que l'un d'entre eux est null, vous finirez par inclure l'élément null dans le json même avec

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

aura pour résultat:

[{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!
        }
    });

ASTUCE: Si vous utilisez DropWizard, vous pouvez récupérer l'ObjectMapper utilisé par Jersey en utilisant environment.getObjectMapper ()