Nullværdier opstår meget i softwareudvikling, og korrekt håndtering af null
værdier kan gøres til en videnskab i sig selv. Jackson er de-facto-biblioteket for serialisering og deserialisering af Java-objekter - og et almindeligt scenarie vedrører serialisering af objekter, der har null
felter.
I denne korte vejledning tager vi et kig på, hvordan du kan ignorere nulfelter, når du serialiserer en POJO med Jackson.
Ændring af ObjectMapper-indstillingerne
Jacksons ObjectMapper er den centrale API, der kortlægger objekter til serialiserede værdier. Du kan naturligvis justere og tilpasse den måde, det fungerer på gennem forskellige flag, hvoraf et er:
objectMapper.setSerializationInclusion(Include.NON_NULL);
Når du serialiserer med denne mapper, vil egenskaber kun blive inkluderet, hvis de ikke er nul.
Dette sætter flaget globalt for ethvert objekt, der serialiseres med objectMapper
eksempel. Hvis du arbejder med Spring Boot, og den ObjectMapper, den er afhængig af, ikke vises, kan du ændre flaget i application.properties
fil:
spring.jackson.default-property-inclusion = non_null
Eller, hvis du bruger application.yml
:
spring:
jackson:
default-property-inclusion: non_null
Bemærk: Ældre versioner af Spring brugt spring.jackson.serialization-inclusion=non_null
i stedet for spring.jackson.default-property-inclusion=non_null
.
Alternativt kan du trække tilbage og erstatte standarden ObjectMapper
eksempel ved at registrere en ny @Primary
@Bean
Opkaldt objectMapper()
, som tilsidesætter standardimplementeringen og tillader fuld tilpasning over den instans, der som standard bruges ved serialisering og deserialisering:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
Denne @Bean
skal gå ind enhver fil der er kommenteret med @Configuration
annotation, og er ofte placeret enten i en specialiseret konfigurationsklasse eller hovedklassen i Spring Boot-applikationen.
Ændring af Jackson2ObjectMapperBuilder-forekomsten
Foråret bruger HttpMessageConverters
at konvertere mellem HTTP-meddelelser og objekter. Standardkonverterne er ObjectMapper
, XmlMapper
instanser instansieret via Jackson2ObjectMapperBuilder
.
I stedet for manuelt at levere det primære ObjectMapper
(erstatter den, der er leveret af bygherren), kan du instruere Spring på hvordan man bygger objektkortlæggeren i stedet. Dette giver Spring mulighed for at udføre sine konfigurationer på højt niveau, uden at du manipulerer med objekter på lavere niveau, mens du stadig tilpasser den måde, det fungerer på. Derudover kan du også tilpasse XmlMapper
denne måde på én gang.
For at tilpasse bygherren, registrerer du en ny @Bean
of Jackson2ObjectMapperBuilderCustomizer
type, som tilpasser og returnerer builder:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@JsonInkluder annotering
I den anden ende af spektret kan vi bruge annoteringer, som et lavkode-alternativ! Annoteringer kan anvendes på klasseniveau eller metodeniveau:
@JsonInclude(JsonInclude.Include.NON_NULL)
Dette giver dig mulighed for kun at tilpasse bestemte klasser i stedet for den globale opførsel af objektkortlæggeren.
Tjek vores praktiske, praktiske guide til at lære Git, med bedste praksis, brancheaccepterede standarder og inkluderet snydeark. Stop med at google Git-kommandoer og faktisk lærer det!
Bemærk: Fra Jackson 2.0 er annotationens værdi JsonInclude.Include.NON_NULL
. For tidligere versioner, brug include=JsonSerialize.Inclusion.NON_NULL
.
@JsonInkluder på klasseniveau
Når du anvender @JsonInclude
på klasseniveau strækker annotationen sig til alle gettere og sættere:
@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 givet felt, der har en null
værdien bliver ikke serialiseret.
@JsonInclude på metodeniveau
Alternativt kan du anvende annoteringen på metodeniveau som den mest granulære mulighed:
@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 uddrag - annoteringen anvendes kun på TransactionType
felt.
Konklusion
I denne guide har du lært, hvordan du ignorerer nulfelter i Jackson med Java og Spring Boot. Dette kan opnås globalt ved at erstatte det underliggende implicitte ObjectMapper
instans og tilpasse adfærden for den nye primære bean, du registrerer.
Alternativt kan du tilpasse Jackson2ObjectMapperBuilder
der bygger ObjectMapper
til din applikation i stedet for at erstatte den allerede byggede. For en lavkodeløsning – du kan ændre spring.jackson.default-property-inclusion
ejendom i dine ejendomsfiler.
Endelig – du kan bruge @JsonInclude
anmærkning på klasseniveau eller metodeniveau.