Ignorirajte ničelna polja z Jacksonom v Javi in ​​Spring Boot

Ničelne vrednosti se pogosto pojavljajo pri razvoju programske opreme in pravilnem ravnanju z njimi null vrednote se lahko spremenijo v znanost samo po sebi. Jackson je de facto knjižnica za serializacijo in deserializacijo objektov Java – in pogost scenarij se nanaša na serializacijo objektov, ki imajo null Polja.

V tej kratki vadnici si bomo ogledali, kako lahko prezrete ničelna polja pri serializaciji POJO z Jacksonom.

Spreminjanje nastavitev ObjectMapper

Jacksonov ObjectMapper je osrednji API, ki preslika predmete v serializirane vrednosti. Seveda lahko prilagodite in prilagodite način delovanja prek različnih zastavic, ena od njih je:

objectMapper.setSerializationInclusion(Include.NON_NULL);

Pri serializaciji s tem preslikavom bodo lastnosti vključene le, če niso ničelne.

To nastavi zastavo po vsem svetu za kateri koli predmet, ki je serializiran z objectMapper primerek. Če delate s programom Spring Boot in ObjectMapper, na katerega se opira, ni izpostavljen, lahko spremenite zastavico v application.properties datoteka:

spring.jackson.default-property-inclusion = non_null

Ali, če uporabljate application.yml:

spring:
  jackson:
    default-property-inclusion: non_null

Opomba: Uporabljene starejše različice Spring spring.jackson.serialization-inclusion=non_null Namesto spring.jackson.default-property-inclusion=non_null.

Druga možnost je, da odlepite in zamenjate privzeto ObjectMapper na primer z registracijo novega @Primary @Bean, ki se imenuje objectMapper(), ki preglasi privzeto izvedbo in omogoča popolno prilagoditev primerka, ki bo privzeto uporabljen pri serializaciji in deserializaciji:

@Bean
@Primary
public ObjectMapper objectMapper() {
    return new ObjectMapper()
      .setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

Ta @Bean bi moral iti v katero koli datoteko ki je označen z @Configuration opombo in se pogosto nahaja bodisi v specializiranem konfiguracijskem razredu bodisi v glavnem razredu aplikacije Spring Boot.

Spreminjanje primerka Jackson2ObjectMapperBuilder

Pomlad uporablja HttpMessageConverters za pretvorbo med sporočili HTTP in objekti. Privzeti pretvorniki so ObjectMapper in XmlMapper primerki, instancirani prek Jackson2ObjectMapperBuilder.

Namesto ročnega zagotavljanja primarnega ObjectMapper (zamenjava tistega, ki ga je zagotovil graditelj), lahko naročite Spring kako zgraditi namesto tega preslikava objektov. To Springu omogoča, da izvede svoje konfiguracije na visoki ravni, ne da bi posegali v objekte na nižji ravni, medtem ko še vedno prilagaja način delovanja. Poleg tega lahko tudi prilagodite XmlMapper na ta način v enem zamahu.

Če želite prilagoditi graditelja, registrirajte novega @Bean of Jackson2ObjectMapperBuilderCustomizer tip, ki prilagodi in vrne graditelj:

@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
    return builder -> {
      builder.serializationInclusion(JsonInclude.Include.NON_NULL);
    }
}

Opomba @JsonInclude

Na drugem koncu spektra lahko uporabimo opombe kot alternativo z nizko kodo! Opombe je mogoče uporabiti na ravni razreda ali metode:

@JsonInclude(JsonInclude.Include.NON_NULL)

To vam omogoča, da prilagodite samo določene razrede, namesto globalnega vedenja preslikava objektov.

Oglejte si naš praktični, praktični vodnik za učenje Gita z najboljšimi praksami, standardi, sprejetimi v panogi, in priloženo goljufijo. Nehajte Googlati ukaze Git in pravzaprav naučiti it!

Opomba: Od Jackson 2.0 je vrednost opombe JsonInclude.Include.NON_NULL. Za prejšnje različice uporabite include=JsonSerialize.Inclusion.NON_NULL.

@JsonInclude na ravni razreda

Ko se prijavite @JsonInclude na ravni razreda se opomba razširi na vse pridobivalnike in nastavljalce:

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

Vsako polje, ki ima a null vrednost ne bo serializirana.

@JsonInclude na ravni metode

Druga možnost je, da opombo uporabite na ravni metode kot najbolj razdrobljeno možnost:

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

V tem izrezku – se opomba uporablja samo za TransactionType področju.

zaključek

V tem priročniku ste se naučili, kako prezreti ničelna polja v Jacksonu z Javo in Spring Boot. To je mogoče doseči globalno z zamenjavo osnovnega implicitnega ObjectMapper in prilagajanje obnašanja novega primarnega gradnika, ki ga registrirate.

Lahko pa tudi prilagodite Jackson2ObjectMapperBuilder ki gradi ObjectMapper za vašo aplikacijo namesto zamenjave že vgrajene. Za rešitev z nizko kodo – lahko spremenite spring.jackson.default-property-inclusion lastnost v vaših datotekah lastnosti.

Končno – lahko uporabite @JsonInclude opombo na ravni razreda ali metode.

Časovni žig:

Več od Stackabuse