A szoftverfejlesztésben és a megfelelő kezelésben a nullértékek sokat merülnek fel null
az értékek önmagukban tudománnyá változhatnak. A Jackson a Java objektumok szerializálásának és deszerializálásának de facto könyvtára – és egy gyakori forgatókönyv az olyan objektumok szerializálására vonatkozik, amelyek null
mezők.
Ebben a rövid oktatóanyagban azt nézzük meg, hogyan hagyhatja figyelmen kívül a null mezőket, amikor Jacksonnal szerializál egy POJO-t.
Az ObjectMapper beállításainak módosítása
A Jackson ObjectMapper a központi API, amely az objektumokat soros értékekre képezi le. Természetesen különféle jelzők segítségével módosíthatja és testreszabhatja a működését, amelyek közül az egyik:
objectMapper.setSerializationInclusion(Include.NON_NULL);
Ha ezzel a leképezővel szerializálja, a tulajdonságok csak akkor kerülnek bele, ha nem nullák.
Ez állítja be a zászlót globálisan minden olyan objektumhoz, amelyet a objectMapper
példa. Ha a Spring Boot-tal dolgozik, és az ObjectMapper, amelyre támaszkodik, nincs kitéve, módosíthatja a jelzőt a application.properties
file:
spring.jackson.default-property-inclusion = non_null
Vagy ha használod application.yml
:
spring:
jackson:
default-property-inclusion: non_null
Jegyzet: A Spring régebbi verziói használtak spring.jackson.serialization-inclusion=non_null
helyett spring.jackson.default-property-inclusion=non_null
.
Alternatív megoldásként lehúzhatja az alapértelmezettet ObjectMapper
például új regisztrálásával @Primary
@Bean
, nevezett objectMapper()
, amely felülírja az alapértelmezett megvalósítást, és lehetővé teszi a teljes testreszabást a példányon, amely alapértelmezés szerint a szerializáláskor és a deszerializáláskor használatos:
@Bean
@Primary
public ObjectMapper objectMapper() {
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
Ezt @Bean
bele kellene menni bármilyen fájlt amely a következővel van megjelölve @Configuration
megjegyzés, és gyakran egy speciális konfigurációs osztályban vagy a Spring Boot alkalmazás fő osztályában található.
A Jackson2ObjectMapperBuilder példány módosítása
A tavasz használja a HttpMessageConverters
a HTTP-üzenetek és objektumok közötti konvertáláshoz. Az alapértelmezett konverterek a ObjectMapper
és a XmlMapper
a példányokon keresztül példányosított példányok Jackson2ObjectMapperBuilder
.
Az elsődleges megadása helyett ObjectMapper
(az építtető által biztosított helyett), utasíthatja a Spring on hogyan kell építeni helyette az objektumleképezőt. Ez lehetővé teszi a Spring számára a magas szintű konfigurációk elvégzését anélkül, hogy az alacsonyabb szintű objektumokat manipulálná, miközben továbbra is testreszabhatja a működését. Ezenkívül személyre szabhatja a XmlMapper
így egy menetben.
Az építő testreszabásához újat kell regisztrálnia @Bean
of Jackson2ObjectMapperBuilderCustomizer
típus, amely testreszabja és visszaadja az építőt:
@Bean
public Jackson2ObjectMapperBuilderCustomizer customBuilder() {
return builder -> {
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
}
}
@JsonInclude megjegyzés
A spektrum másik végén az annotációkat használhatjuk alacsony kódú alternatívaként! A megjegyzések osztály- vagy metódusszinten alkalmazhatók:
@JsonInclude(JsonInclude.Include.NON_NULL)
Ez csak bizonyos osztályok testreszabását teszi lehetővé az objektumleképező globális viselkedése helyett.
Tekintse meg gyakorlatias, gyakorlati útmutatónkat a Git tanulásához, amely tartalmazza a bevált gyakorlatokat, az iparág által elfogadott szabványokat és a mellékelt csalólapot. Hagyd abba a guglizást a Git parancsokkal, és valójában tanulni meg!
Jegyzet: A Jackson 2.0-tól kezdve a kommentár értéke: JsonInclude.Include.NON_NULL
. Korábbi verziók esetén használja include=JsonSerialize.Inclusion.NON_NULL
.
@JsonInclude osztályszinten
Ha alkalmazza @JsonInclude
osztályszinten a megjegyzés kiterjed az összes getterre és setterre:
@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;
}
Bármely adott mező, amely rendelkezik a null
az érték nem lesz sorozatos.
@JsonInclude a módszer szintjén
Alternatív megoldásként a megjegyzést módszerszinten is alkalmazhatja a legrészletesebb lehetőségként:
@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;
}
Ebben a részletben – a megjegyzés csak a TransactionType
mező.
Következtetés
Ebből az útmutatóból megtanulta, hogyan lehet figyelmen kívül hagyni a null mezőket Jacksonban Java és Spring Boot segítségével. Ez globálisan elérhető a mögöttes implicit felváltásával ObjectMapper
példány és a regisztrált új elsődleges komponens viselkedésének testreszabása.
Alternatív megoldásként testreszabhatja a Jackson2ObjectMapperBuilder
amely építi a ObjectMapper
alkalmazásához, ahelyett, hogy lecserélné a már megépítettet. Alacsony kódú megoldáshoz – módosíthatja a spring.jackson.default-property-inclusion
tulajdonság fájljaiban.
Végül – használhatja a @JsonInclude
osztályszintű vagy metódusszintű annotáció.