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;
}
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 .
Avec Jackson > 1.9.11 et < 2.x pour ce faire, utilisez @JsonSerialize
annotation:
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
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!
Dans Jackson 2.x, utiliser:
@JsonInclude(JsonInclude.Include.NON_NULL)
vous pouvez utiliser la configuration mapper suivante:
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.NON_NULL);
depuis 2.5 vous pouvez utiliser:
mapper.setSerializationInclusion(Include.NON_NULL);
dans mon cas
@JsonInclude(Include.NON_EMPTY)
l'a fait marcher.
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
@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.
si vous voulez ajouter cette règle à tous les modèles dans Jackson 2.6 + utiliser:
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
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
pour Jackson 2.5 utilisation:
@JsonInclude(content=Include.NON_NULL)
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)
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 ()
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;
}
}
Jackson 2.x+ utilisation
mapper.getSerializationConfig().withSerializationInclusion(JsonInclude.Include.NON_NULL);