chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Spring Boot時(shí)配置JSON序列化選項(xiàng)的幾種方法

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-09 10:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在Spring Boot Web 項(xiàng)目中,當(dāng)使用JSON格式接收數(shù)據(jù)和返回?cái)?shù)據(jù)的時(shí)候,Spring Boot 默認(rèn)使用一個(gè)ObjectMapper實(shí)例來序列化響應(yīng)和反序列化請(qǐng)求。

在本文中,我們將看看配置序列化和反序列化選項(xiàng)的最常用方法。

默認(rèn)配置

默認(rèn)情況下,Spring Boot的配置將禁用以下配置項(xiàng)。

  • MapperFeature.DEFAULT_VIEW_INCLUSION
  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
  • SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。

舉個(gè)例子

  • 客戶端將發(fā)送一個(gè)GET請(qǐng)求到我們的/coffee?name=Javazzz。
  • 控制器將返回一個(gè)新的Coffee對(duì)象。
  • Spring將使用ObjectMapper將我們的POJO序列化為JSON。

我們將通過使用String和LocalDateTime對(duì)象來示范定制選項(xiàng)。

public class Coffee {

    private String name;
    private String brand;
    private LocalDateTime date;

   //getter and setter
}

我們還將定義一個(gè)簡單的REST控制器來演示序列化。

@GetMapping("/coffee")
public Coffee getCoffee(
        @RequestParam(required = false) String brand,
        @RequestParam(required = false) String name) {
    return new Coffee()
      .setBrand(brand)
      .setDate(FIXED_DATE)
      .setName(name);
}

默認(rèn)情況下,這將是調(diào)用GET http://lolcahost:8080/coffee?brand=javazzz 時(shí)的響應(yīng)。

{
  "name": null,
  "brand": "javazzz",
  "date": "2022-06-16T10:21:35.974"
}

我們希望排除空值,并有一個(gè)自定義的日期格式(dd-MM-yyyy HH:mm)。這就是我們的響應(yīng)結(jié)果。

{
  "brand": "javazzz",
  "date": "06-11-2022 10:34"
}

在使用Spring Boot時(shí),我們可以選擇定制默認(rèn)的ObjectMapper或覆蓋它。我們將在接下來的章節(jié)中介紹這兩個(gè)選項(xiàng)。

自定義默認(rèn)的ObjectMapper

在本節(jié)中,我們將看到如何定制Spring Boot使用的默認(rèn)ObjectMapper。

1.應(yīng)用程序?qū)傩院妥远x Jackson 模塊

配置映射器的最簡單方法是通過應(yīng)用程序?qū)傩浴?/p>

下面是配置的一般結(jié)構(gòu)。

spring.jackson.< category_name >.< feature_name >=true,false

作為一個(gè)例子,下面是我們要添加的內(nèi)容,以禁用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。

spring.jackson.serialization.write-dates-as-timestamps=false

除了提到的特征類別,我們還可以配置屬性的包含。

spring.jackson.default-property-inclusion=always, non_null, non_absent, non_default, non_empty

配置環(huán)境變量是最簡單的方法。這種方法的缺點(diǎn)是,我們不能定制高級(jí)選項(xiàng),比如為LocalDateTime定制日期格式。

在這一點(diǎn)上,我們會(huì)得到這樣的結(jié)果。

{
  "brand": "javazzz",
  "date": "2022-06-16T10:35:34.593"
}

為了實(shí)現(xiàn)我們的目標(biāo),我們將注冊一個(gè)新的JavaTimeModule,用我們的自定義日期格式。

@Configuration
@PropertySource("classpath:coffee.properties")
public class CoffeeRegisterModuleConfig {

    @Bean
    public Module javaTimeModule() {
        JavaTimeModule module = new JavaTimeModule();
        module.addSerializer(LOCAL_DATETIME_SERIALIZER);
        return module;
    }
}

另外,配置屬性文件coffee.properties將包含以下內(nèi)容。

spring.jackson.default-property-inclusion=non_null

Spring Boot會(huì)自動(dòng)注冊任何類型為com.fastxml.jackson.databind.Module的bean。下面是我們的最終結(jié)果。

{
  "brand": "Javazzz",
  "date": "16-06-2022 10:43"
}

2.Jackson2ObjectMapperBuilderCustomizer

這個(gè)功能接口的目的是讓我們創(chuàng)建配置。

它們將被應(yīng)用于通過Jackson2ObjectMapperBuilder創(chuàng)建的默認(rèn)ObjectMapper。

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

配置得以特定的順序應(yīng)用,我們可以使用@Order annotation來控制。如果我們想從不同的配置或模塊來配置ObjectMapper,這種優(yōu)雅的方法是適合的。

重寫默認(rèn)配置

如果我們想完全控制配置,有幾個(gè)選項(xiàng)可以禁用自動(dòng)配置,只允許應(yīng)用我們的自定義配置。

讓我們仔細(xì)研究一下這些選項(xiàng)。

1.ObjectMapper

覆蓋默認(rèn)配置的最簡單方法是定義一個(gè)ObjectMapper Bean并將其標(biāo)記為@Primary。

@Bean
@Primary
public ObjectMapper objectMapper() {
    JavaTimeModule module = new JavaTimeModule();
    module.addSerializer(LOCAL_DATETIME_SERIALIZER);
    return new ObjectMapper()
      .setSerializationInclusion(JsonInclude.Include.NON_NULL)
      .registerModule(module);
}

當(dāng)我們想完全控制序列化過程而不想允許外部配置時(shí),我們應(yīng)該使用這種方法。

2.Jackson2ObjectMapperBuilder

另一種干凈的方法是定義一個(gè)Jackson2ObjectMapperBuilderbean。

實(shí)際上,Spring Boot在構(gòu)建ObjectMapper時(shí)默認(rèn)使用這個(gè)構(gòu)建器,并會(huì)自動(dòng)拾取定義的構(gòu)建器。

@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
    return new Jackson2ObjectMapperBuilder().serializers(LOCAL_DATETIME_SERIALIZER)
      .serializationInclusion(JsonInclude.Include.NON_NULL);
}

它將默認(rèn)配置兩個(gè)選項(xiàng)。

  • 禁用MapperFeature.DEFAULT_VIEW_INCLUSION
  • 禁用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES。

根據(jù)Jackson2ObjectMapperBuilder 文檔,如果classpath上有一些模塊,它也會(huì)注冊這些模塊。

  • jackson-datatype-jdk8:支持其他Java 8類型,如Optional
  • jackson-datatype-jsr310:支持Java 8 Date and Time API類型
  • jackson-datatype-joda:支持Joda-Time類型
  • jackson-module-kotlin:支持Kotlin類和數(shù)據(jù)類

這種方法的優(yōu)點(diǎn)是,Jackson2ObjectMapperBuilder提供了一種簡單而直觀的方法來構(gòu)建ObjectMapper。

3.MappingJackson2HttpMessageConverter的方法

我們可以直接定義一個(gè)類型為MappingJackson2HttpMessageConverter的bean,Spring Boot會(huì)自動(dòng)使用它。

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().serializers(LOCAL_DATETIME_SERIALIZER)
      .serializationInclusion(JsonInclude.Include.NON_NULL);
    return new MappingJackson2HttpMessageConverter(builder.build());
}

測試配置

為了測試我們的配置,我們將使用TestRestTemplate并將對(duì)象序列化為String。

通過這種方式,我們可以驗(yàn)證我們的Coffee對(duì)象在序列化時(shí)沒有null值,并且具有自定義的日期格式。

@Test
public void whenGetCoffee_thenSerializedWithDateAndNonNull() {
    String formattedDate = DateTimeFormatter.ofPattern(CoffeeConstants.dateTimeFormat).format(FIXED_DATE);
    String brand = "Javazza";
    String url = "/coffee?brand=" + brand;
    
    String response = restTemplate.getForObject(url, String.class);
    
    assertThat(response).isEqualTo("{"brand":"" + brand + "","date":"" + formattedDate + ""}");
}

總結(jié)

在這篇文章中,我們看了使用Spring Boot時(shí)配置JSON序列化選項(xiàng)的幾種方法。

我們看到了兩種不同的方法:配置默認(rèn)選項(xiàng)或重寫默認(rèn)配置。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制器
    +關(guān)注

    關(guān)注

    114

    文章

    17113

    瀏覽量

    184370
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7256

    瀏覽量

    91900
  • JSON
    +關(guān)注

    關(guān)注

    0

    文章

    122

    瀏覽量

    7401
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    175

    瀏覽量

    401
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用Serde進(jìn)行序列化和反序列化

    Serde 是一個(gè)用于序列化和反序列化 Rust 數(shù)據(jù)結(jié)構(gòu)的庫。它支持 JSON、BSON、YAML 等多種格式,并且可以自定義序列化和反序列化
    的頭像 發(fā)表于 09-30 17:09 ?1696次閱讀

    怎么支持PIC32中的JSON解析和序列化

    我正在尋找支持或庫,允許我將JSON對(duì)象序列化為char數(shù)組,并將char數(shù)組/字符串解析為JSON對(duì)象。我查看了JSMN庫,但它看起來只是解析,而不是序列化。我目前在ARDUINO板
    發(fā)表于 11-28 16:46

    Java序列化的機(jī)制和原理

    數(shù)據(jù)的協(xié)議。Java序列化機(jī)制就是為了解決這個(gè)問題而產(chǎn)生。如何序列化一個(gè)對(duì)象一個(gè)對(duì)象能夠序列化的前提是實(shí)現(xiàn)Serializable接口,Serializable接口沒有方法,更像是個(gè)標(biāo)
    發(fā)表于 07-10 07:27

    LabVIEW序列化編程,可做通用配置架構(gòu)

    LabVIEW序列化編程,可做通用配置架構(gòu)[img=110,0][/img][img=110,0][/img]
    發(fā)表于 04-23 16:47

    啟動(dòng)Spring Boot項(xiàng)目應(yīng)用的三種方法

    ,從而使開發(fā)人員不再需要定義樣板配置。用我的話來理解,就是spring boot其實(shí)不是什么新的框架,它默認(rèn)配置了很多框架的使用方式,就
    發(fā)表于 01-14 17:33

    c語言序列化和反序列化有何區(qū)別

    這里寫自定義目錄標(biāo)題c語言序列化和反序列化tplut.htplut.c測試代碼參考c語言序列化和反序列化網(wǎng)絡(luò)調(diào)用,數(shù)據(jù)傳輸都需要把數(shù)據(jù)序列化
    發(fā)表于 07-14 07:32

    SpringMVC JSON框架的自定義序列化與反序列化

    , Object fieldName) {// JSON String反序列化的邏輯比較復(fù)雜,在StringCodec的基礎(chǔ)上,對(duì)其結(jié)果調(diào)用trim方法Object obj
    發(fā)表于 10-10 16:02

    理解PHP反序列化漏洞

    理解PHP反序列化漏洞
    發(fā)表于 09-07 11:03 ?7次下載
    理解PHP反<b class='flag-5'>序列化</b>漏洞

    java序列化和反序列化范例和JDK類庫中的序列化API

    一、序列化和反序列化的概念 把對(duì)象轉(zhuǎn)換為字節(jié)序列的過程稱為對(duì)象的序列化。 把字節(jié)序列恢復(fù)為對(duì)象的過程稱為對(duì)象的反
    發(fā)表于 09-27 10:13 ?6次下載

    static屬性為什么不會(huì)被序列化

    實(shí)現(xiàn)序列化和反序列化為什么要實(shí)現(xiàn)Serializable接口?
    的頭像 發(fā)表于 07-15 11:03 ?2046次閱讀

    C#實(shí)現(xiàn)對(duì)象序列化的三種方式是什么

    很多小伙伴一提到序列化,都會(huì)想到二進(jìn)制序列化,但其實(shí)序列化并不僅僅只是二進(jìn)制序列化,我們常說的對(duì)象序列化有三種方式,分別是二進(jìn)制
    的頭像 發(fā)表于 02-22 16:11 ?1493次閱讀
    C#實(shí)現(xiàn)對(duì)象<b class='flag-5'>序列化</b>的三種方式是什么

    什么是序列化 為什么要序列化

    什么是序列化? “序列化”(Serialization )的意思是將一個(gè)對(duì)象轉(zhuǎn)化為字節(jié)流。 這里說的對(duì)象可以理解為“面向?qū)ο蟆崩锏哪莻€(gè)對(duì)象,具體的就是存儲(chǔ)在內(nèi)存中的對(duì)象數(shù)據(jù)。 與之相反的過程是“反序列化
    的頭像 發(fā)表于 09-14 17:22 ?3312次閱讀
    什么是<b class='flag-5'>序列化</b> 為什么要<b class='flag-5'>序列化</b>

    如何用C語言進(jìn)行json序列化和反序列化

    呢? 當(dāng)前,應(yīng)用最廣泛的C語言json解析庫當(dāng)屬cJSON,但是,使用cJSON讀json進(jìn)行序列化和反序列化,需要根據(jù)key一個(gè)一個(gè)進(jìn)行處理,會(huì)導(dǎo)致代碼冗余,邏輯性不強(qiáng),哪有沒有更好
    的頭像 發(fā)表于 10-07 11:05 ?2023次閱讀

    Java序列化怎么使用

    轉(zhuǎn)換方式就叫做序列化。將文件或者網(wǎng)絡(luò)傳輸中得到的 byte[] 數(shù)組轉(zhuǎn)換為 java 對(duì)象就叫做反序列化。 怎么使用 如果一個(gè) Java 對(duì)象要能被序列化,必須實(shí)現(xiàn)一個(gè)特殊
    的頭像 發(fā)表于 10-10 14:19 ?661次閱讀

    Spring Boot 的設(shè)計(jì)目標(biāo)

    Spring 框架復(fù)雜的XML配置。使用 Spring Boot 可以很容易創(chuàng)建一個(gè)獨(dú)立運(yùn)行的、基于 Spring 的生產(chǎn)級(jí)應(yīng)用程序,而且
    的頭像 發(fā)表于 10-13 14:56 ?800次閱讀
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的設(shè)計(jì)目標(biāo)