Nolla-arvot syntyvät paljon ohjelmistokehityksessä ja niiden asianmukaisessa käsittelyssä null
arvot voidaan muuttaa tieteeksi sinänsä. Jackson on de facto -kirjasto Java-objektien serialisointiin ja deserialisointiin – ja yleinen skenaario koskee sellaisten objektien sarjoittamista, joissa on null
kentät.
Tässä lyhyessä opetusohjelmassa tarkastellaan, kuinka voit jättää huomioimatta nollakentät, kun sarjoit POJO:n Jacksonin kanssa.
ObjectMapperin asetusten muuttaminen
Jacksonin ObjectMapper on keskeinen API, joka kartoittaa objektit sarjoitettuihin arvoihin. Luonnollisesti voit säätää ja mukauttaa sen toimintaa eri lippujen avulla, joista yksi on:
objectMapper.setSerializationInclusion(Include.NON_NULL);
Kun sarjoitetaan tällä kartoittajalla, ominaisuudet otetaan mukaan vain, jos ne eivät ole nolla-arvoja.
Tämä asettaa lipun maailmanlaajuisesti mille tahansa objektille, joka sarjoitetaan objectMapper
ilmentymä. Jos työskentelet Spring Bootin kanssa, eikä ObjectMapper, johon se luottaa, ei ole esillä, voit muuttaa lippua application.properties
tiedosto:
spring.jackson.default-property-inclusion = non_null
Tai jos käytät application.yml
:
spring:
jackson:
default-property-inclusion: non_null
Huomautus: Kevään vanhempia versioita käytetty spring.jackson.serialization-inclusion=non_null
sijasta spring.jackson.default-property-inclusion=non_null
.
Vaihtoehtoisesti voit irrottaa takaisin oletusasetuksen ObjectMapper
esimerkiksi rekisteröimällä uusi @Primary
@Bean
, nimeltään objectMapper()
, joka ohittaa oletustoteutuksen ja sallii täyden mukauttamisen ilmentymässä, jota käytetään oletuksena sarjoitettaessa ja sarjoitettaessa:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
Tämä @Bean
pitäisi mennä sisään mikä tahansa tiedosto joka on merkitty @Configuration
huomautus, ja se sijaitsee usein joko erikoiskonfiguraatioluokassa tai Spring Boot -sovelluksen pääluokassa.
Jackson2ObjectMapperBuilder-instanssin muuttaminen
Kevät käyttää HttpMessageConverters
muuntaa HTTP-viestien ja objektien välillä. Oletusmuuntimet ovat ObjectMapper
ja XmlMapper
-sovelluksen kautta instantoidut tapaukset Jackson2ObjectMapperBuilder
.
Sen sijaan, että antaisit ensisijaisen manuaalisesti ObjectMapper
(korvaa rakentajan toimittaman), voit ohjata Spring päälle miten rakentaa sen sijaan objektikartoittaja. Tämän ansiosta Spring voi tehdä korkean tason konfiguraatioita ilman, että joudut peukaloimaan alemman tason objekteja, samalla kun muokkaat sen toimintaa. Lisäksi voit myös mukauttaa XmlMapper
tällä tavalla yhdellä kertaa.
Mukautaksesi rakentajaa, rekisteröit uuden @Bean
of Jackson2ObjectMapperBuilderCustomizer
tyyppi, joka mukauttaa ja palauttaa rakentajan:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@JsonInclude Annotation
Toisessa päässä voimme käyttää annotaatioita alhaisen koodin vaihtoehtona! Huomautuksia voidaan käyttää luokka- tai menetelmätasolla:
@JsonInclude(JsonInclude.Include.NON_NULL)
Tämän avulla voit mukauttaa vain tiettyjä luokkia objektikartoittajan yleisen toiminnan sijaan.
Tutustu käytännönläheiseen, käytännölliseen Gitin oppimisoppaaseemme, jossa on parhaat käytännöt, alan hyväksymät standardit ja mukana tuleva huijauslehti. Lopeta Git-komentojen googlailu ja oikeastaan oppia se!
Huomautus: Jackson 2.0:sta lähtien merkinnän arvo on JsonInclude.Include.NON_NULL
. Käytä aiemmissa versioissa include=JsonSerialize.Inclusion.NON_NULL
.
@JsonInclude luokkatasolla
Kun haet @JsonInclude
luokkatasolla huomautus ulottuu kaikkiin saajiin ja asettajiin:
@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;
}
Mikä tahansa kenttä, jolla on a null
arvoa ei sarjoiteta.
@JsonInclude menetelmätasolla
Vaihtoehtoisesti voit käyttää merkintää menetelmätasolla tarkimpana vaihtoehtona:
@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;
}
Tässä katkelmassa merkintä koskee vain TransactionType
ala.
Yhteenveto
Tässä oppaassa olet oppinut sivuuttamaan nollakentät Jacksonissa Javalla ja Spring Bootilla. Tämä voidaan saavuttaa maailmanlaajuisesti korvaamalla taustalla oleva implisiittinen ObjectMapper
esimerkki ja mukauttamalla rekisteröimäsi uuden ensisijaisen bean toimintaa.
Vaihtoehtoisesti voit mukauttaa Jackson2ObjectMapperBuilder
joka rakentaa ObjectMapper
sovelluksellesi sen sijaan, että korvaat jo valmiin. Matalakoodiratkaisua varten voit muuttaa spring.jackson.default-property-inclusion
ominaisuustiedostoissasi.
Lopuksi – voit käyttää @JsonInclude
huomautus luokka- tai menetelmätasolla.