Nullverdier oppstår mye i programvareutvikling, og riktig håndtering av null
verdier kan gjøres om til en vitenskap i seg selv. Jackson er de-facto-biblioteket for serialisering og deserialisering av Java-objekter – og et vanlig scenario gjelder å serialisere objekter som har null
felt.
I denne korte opplæringen tar vi en titt på hvordan du kan ignorere null-felt når du serialiserer en POJO med Jackson.
Endre ObjectMapper-innstillingene
Jacksons ObjectMapper er den sentrale API-en som kartlegger objekter til serialiserte verdier. Naturligvis kan du justere og tilpasse måten det fungerer på gjennom forskjellige flagg, hvorav ett er:
objectMapper.setSerializationInclusion(Include.NON_NULL);
Når du serialiserer med denne kartleggeren, vil egenskaper bare inkluderes hvis de ikke er null.
Dette setter flagget globalt for ethvert objekt som serialiseres med objectMapper
forekomst. Hvis du jobber med Spring Boot, og ObjectMapperen den er avhengig av ikke er eksponert, kan du endre flagget i application.properties
file:
spring.jackson.default-property-inclusion = non_null
Eller, hvis du bruker application.yml
:
spring:
jackson:
default-property-inclusion: non_null
OBS: Eldre versjoner av Spring brukt spring.jackson.serialization-inclusion=non_null
istedenfor spring.jackson.default-property-inclusion=non_null
.
Alternativt kan du trekke tilbake og erstatte standarden ObjectMapper
eksempel ved å registrere en ny @Primary
@Bean
, oppkalt objectMapper()
, som overstyrer standardimplementeringen og tillater full tilpasning over forekomsten som vil bli brukt som standard ved serialisering og deserialisering:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
Dette @Bean
bør gå inn hvilken som helst fil som er merket med @Configuration
annotering, og er ofte plassert enten i en spesialisert konfigurasjonsklasse eller hovedklassen til Spring Boot-applikasjonen.
Endre Jackson2ObjectMapperBuilder-forekomsten
Våren bruker HttpMessageConverters
å konvertere mellom HTTP-meldinger og objekter. Standard omformere er ObjectMapper
og XmlMapper
forekomster instansiert via Jackson2ObjectMapperBuilder
.
I stedet for manuelt å gi den primære ObjectMapper
(erstatter den som er levert av byggherren), kan du instruere Spring on hvordan bygge objektkartleggeren i stedet. Dette lar Spring gjøre konfigurasjonene på høyt nivå uten at du tukler med objektene på lavere nivå, samtidig som den tilpasser måten den fungerer på. I tillegg kan du også tilpasse XmlMapper
denne måten på en gang.
For å tilpasse byggherren, registrerer du en ny @Bean
of Jackson2ObjectMapperBuilderCustomizer
type, som tilpasser og returnerer byggherren:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@JsonInkluder merknad
I den andre enden av spekteret kan vi bruke merknader, som et lavkodealternativ! Merknader kan brukes på klassenivå eller metodenivå:
@JsonInclude(JsonInclude.Include.NON_NULL)
Dette lar deg tilpasse bare visse klasser, i stedet for den globale oppførselen til objektkartleggeren.
Sjekk ut vår praktiske, praktiske guide for å lære Git, med beste praksis, bransjeaksepterte standarder og inkludert jukseark. Slutt å google Git-kommandoer og faktisk lære den!
OBS: Fra og med Jackson 2.0 er merknadens verdi JsonInclude.Include.NON_NULL
. For tidligere versjoner, bruk include=JsonSerialize.Inclusion.NON_NULL
.
@JsonInkluder på klassenivå
Når du søker @JsonInclude
på klassenivå strekker merknaden seg til alle gettere og settere:
@Entity(name="property")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Property implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String id;
@Column(name="transaction_type")
private TransactionType transactionType;
@Column(name="property_type")
private PropertyType propertyType;
}
Ethvert gitt felt som har en null
verdien blir ikke serialisert.
@JsonInkluder på metodenivå
Alternativt kan du bruke merknaden på metodenivå som det mest detaljerte alternativet:
@Entity(name="property")
public class Property implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String id;
@Column(name="transaction_type")
@JsonInclude(JsonInclude.Include.NON_NULL)
private TransactionType transactionType;
@Column(name="property_type")
private PropertyType propertyType;
}
I dette utdraget – merknaden brukes bare på TransactionType
feltet.
konklusjonen
I denne veiledningen har du lært hvordan du ignorerer null-felt i Jackson, med Java og Spring Boot. Dette kan oppnås globalt ved å erstatte det underliggende implisitte ObjectMapper
forekomst og tilpasse oppførselen til den nye primærbønnen du registrerer.
Alternativt kan du tilpasse Jackson2ObjectMapperBuilder
som bygger ObjectMapper
for applikasjonen din i stedet for å erstatte den allerede bygde. For en lavkodeløsning – du kan endre spring.jackson.default-property-inclusion
eiendom i egenskapsfilene dine.
Til slutt – du kan bruke @JsonInclude
merknad på klassenivå eller metodenivå.