最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot解析JSON數(shù)據(jù)的三種方案

 更新時間:2024年03月20日 11:00:01   作者:Archie_java  
JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,易于人閱讀和編寫,同時也易于機(jī)器解析和生成,本文給大家介紹了SpringBoot解析JSON數(shù)據(jù)的三種方案,需要的朋友可以參考下

1 JSON簡介

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式。易于人閱讀和編寫。同時也易于機(jī)器解析和生成。JSON是一個標(biāo)記符的序列。這套標(biāo)記符包含六個構(gòu)造字符、字符串、數(shù)字和三個字面名。JSON是一個序列化的對象或數(shù)組。

2 Spring Boot默認(rèn)的JSON解析

Spring Boot項目中當(dāng)我們添加了spring-boot-starter-web依賴,就默認(rèn)提供了Jackson用于解析Json

2.1 使用示例

創(chuàng)建一個實體類

@Component
public class User {
  private long id;
  private String username;
  private Date birthday;

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public Date getBirthday() {
    return birthday;
  }

  public void setBirthday(Date birthday) {
    this.birthday = birthday;
  }
}

創(chuàng)建一個Controller類,用于頁面訪問:

@RestController
public class ShowController {
  @GetMapping("/show")
  public List<User> show(){
    List<User> users=new ArrayList<User>();
    for (int i = 0; i < 5; i++) {
      User user=new User();
      user.setId(i);
      user.setUsername("張三"+i);
      user.setBirthday(new Date());
      users.add(user);

    }
    return  users;
  }
}

啟動項目,瀏覽器訪問,可以看到默認(rèn)返回了JSON格式的數(shù)據(jù)

在這里插入圖片描述

可以看到上面的Date類型數(shù)據(jù)需要我們自定義格式,在實體類中date屬性上添加JsonFormat注解可以實現(xiàn):

  @JsonFormat(pattern = "YYYY-MM-dd")
  private Date birthday;

修改后重啟項目,瀏覽器訪問:

在這里插入圖片描述

但是當(dāng)很多類都需要配置自定義格式時,就需要添加多個注解,這樣是麻煩且不利于后期維護(hù)的。所以我們需要修改全局JSON格式。

下面以修改Date類型數(shù)據(jù)為例:

2.2 修改特定數(shù)據(jù)的全局JSON格式

JSON的解析離不開HttpMessageConvert,HttpMessageConvert是一個消息轉(zhuǎn)換工具,主要有兩方面的功能:

  • 將服務(wù)端返回的對象序列化成JSON字符串
  • 將前端傳來的JSON字符串反序列化成Java對象

SpringMVC中默認(rèn)配置了Jackson和GsonHttpMessageConverter,Spring Boot中對此做了自動化配置,主要由以下兩個類實現(xiàn):

org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration

JacksonHttpMessageConvertersConfiguration的源碼如下:

@Configuration(
  proxyBeanMethods = false
)
class JacksonHttpMessageConvertersConfiguration {
  JacksonHttpMessageConvertersConfiguration() {
  }

  @Configuration(
    proxyBeanMethods = false
  )
  @ConditionalOnClass({XmlMapper.class})
  @ConditionalOnBean({Jackson2ObjectMapperBuilder.class})
  protected static class MappingJackson2XmlHttpMessageConverterConfiguration {
    protected MappingJackson2XmlHttpMessageConverterConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean
    public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter(Jackson2ObjectMapperBuilder builder) {
      return new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build());
    }
  }
//配置類注解
  @Configuration(
    proxyBeanMethods = false
  )
  /*
  *下面幾個是條件注解,當(dāng)添加了Jackson依賴,就有了ObjectMapper.class和屬性,后面的配置就會生效
  */
  @ConditionalOnClass({ObjectMapper.class})
  @ConditionalOnBean({ObjectMapper.class})
  @ConditionalOnProperty(
    name = {"spring.http.converters.preferred-json-mapper"},
    havingValue = "jackson",
    matchIfMissing = true
  )

  static class MappingJackson2HttpMessageConverterConfiguration {
    MappingJackson2HttpMessageConverterConfiguration() {
    }

/*
*@ConditionalOnMissingBean的意思就是如果我們沒有配置這個Bean,就自動創(chuàng)建一個默認(rèn)的,當(dāng)我們配置了就使用我們配置的Bean,不再創(chuàng)建
*/

    @Bean
    @ConditionalOnMissingBean(
      value = {MappingJackson2HttpMessageConverter.class},
      ignoredType = {"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter", "org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter"}
    )
    /*
    *MappingJackson2HttpMessageConverter就是Jackson的消息轉(zhuǎn)換工具類
    */
    MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
    /*
    *JSON中序列化對象主要用ObjectMapper工具類
    */
      return new MappingJackson2HttpMessageConverter(objectMapper);
    }
  }
}

通過查看上面源碼,可以知道我們修改生成的JSON的全局格式有以下兩種方式:

2.2.1 自定義MappingJackson2HttpMessageConverter

自己創(chuàng)建一個MappingJackson2HttpMessageConverter,取代JacksonHttpMessageConvertersConfiguration中項目自帶的。

例:
在上面創(chuàng)建的項目中,首先刪除JsonFormat注解,下面新建一個配置類,內(nèi)容如下:

@Configuration
public class WebMVCConfig {
  @Bean
  MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
    MappingJackson2HttpMessageConverter converter=new MappingJackson2HttpMessageConverter();
    ObjectMapper om=new ObjectMapper();
    om.setDateFormat(new SimpleDateFormat("YYYY/MM/dd"));
    converter.setObjectMapper(om);
    return converter;
  }
}

2.2.2 自定義ObjectMapper

通過上面的類可以看到類中主要起作用的是ObjectMapping,上面的JacksonHttpMessageConvertersConfiguration可以看ObjectMapping是直接注入的。它是在配置類JacksonAutoConfiguration 中提供的。

在這里插入圖片描述

修改WebMVCConfig類,內(nèi)容如下:

@Configuration
public class WebMVCConfig {
  @Bean
  ObjectMapper objectMapper(){
    ObjectMapper om=new ObjectMapper();
    om.setDateFormat(new SimpleDateFormat("YYYY/MM/DD"));
    return om;
  }

}

兩種方式都是可以的,瀏覽器訪問:

在這里插入圖片描述

3 使用Gson處理JSON

3.1 使用示例

基于上面創(chuàng)建的項目進(jìn)行修改,首先去掉spring-boot-starter-json依賴。然后添加gson依賴:

在這里插入圖片描述

然后將配置類的jackson部分和一些導(dǎo)入的jackson包注釋或刪除,然后啟動項目。

在這里插入圖片描述

可以看到日期格式是Gson默認(rèn)的。需要進(jìn)行修改

3.2 修改特定數(shù)據(jù)的全局JSON格式

GsonHttpMessageConvertersConfiguration的部分源碼如下:

  @Configuration(
    proxyBeanMethods = false
  )
  @ConditionalOnBean({Gson.class})
  @Conditional({GsonHttpMessageConvertersConfiguration.PreferGsonOrJacksonAndJsonbUnavailableCondition.class})
  static class GsonHttpMessageConverterConfiguration {
    GsonHttpMessageConverterConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean
    GsonHttpMessageConverter gsonHttpMessageConverter(Gson gson) {
      GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
      converter.setGson(gson);
      return converter;
    }

可以看到與Jackson差不多,所以可以仿照J(rèn)ackson進(jìn)行修改

3.2.1 自定義GsonHttpMessageConverter

@Configuration
public class WebMVCConfig {
    @Bean
      GsonHttpMessageConverter gsonHttpMessageConverter(){
      GsonHttpMessageConverter converter=new GsonHttpMessageConverter();
      converter.setGson(new GsonBuilder().setDateFormat("YYYY-MM-DD").create());
      return converter;
       }
 }

3.2.2 自定義Gson對象

上面配置主要用的是Gson對象,Gson對象是在GsonAutoConfiguration類中,當(dāng)我們沒有配置時為我們創(chuàng)建的。然后在GsonHttpMessageConverter中使用。我們也可以自己創(chuàng)建一個Gson對象:

@Configuration
public class WebMVCConfig {

       @Bean
  Gson gson(){
   return new GsonBuilder().setDateFormat("YYYY-MM-DD").create();
       }

}

兩種方式都是可以的,瀏覽器訪問:

在這里插入圖片描述

4 使用FastJson處理JSON

4.1 使用示例

以上面創(chuàng)建的項目為基礎(chǔ),去除Jackson依賴,添加FastJson依賴:

在這里插入圖片描述

因為Spring Boot沒有提供相關(guān)的自動化配置類,所以我們需要手動創(chuàng)建FastJson的消息轉(zhuǎn)換工具類:

@Configuration
public class WebMVCConfig {
  @Bean
  FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){
    FastJsonHttpMessageConverter converter=new FastJsonHttpMessageConverter();
    return converter;
  }
  }

啟動項目,瀏覽器訪問:

在這里插入圖片描述

可以看到日期格式變成了FastJson的格式了。需要進(jìn)行修改。

4.2 修改特定數(shù)據(jù)的全局JSON格式

FastJson是直接在 FastJsonHttpMessageConverter類中進(jìn)行修改,新建一個FastJsonConfig對象,此時需要對編碼進(jìn)行設(shè)置,否則會出現(xiàn)亂碼:

@Configuration
public class WebMVCConfig {
  @Bean
  FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){
    FastJsonHttpMessageConverter converter=new FastJsonHttpMessageConverter();
    FastJsonConfig config=new FastJsonConfig();
    // 處理中文亂碼問題
    List<MediaType> fastMediaTypes = new ArrayList<>();
    fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
    converter.setSupportedMediaTypes(fastMediaTypes);
    //設(shè)置日期格式
    config.setDateFormat("YYYY-MM-DD");
    converter.setFastJsonConfig(config);
    return converter;
  }
} 

以上就是SpringBoot解析JSON數(shù)據(jù)的三種方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot解析JSON數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • executor包執(zhí)行器功能

    executor包執(zhí)行器功能

    這篇文章主要介紹了executor包執(zhí)行器功能,executor包中的各個子包提供的功能,最終這些功能都由Executor接口及其實現(xiàn)類共同對外提供服務(wù)。下文介紹該執(zhí)行功能,具有一定的參考價值,需要的朋友可以考一下
    2022-02-02
  • SpringMVC如何訪問WEB-INF jsp過程解析

    SpringMVC如何訪問WEB-INF jsp過程解析

    這篇文章主要介紹了SpringMVC如何訪問WEB-INF jsp過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java貪吃蛇游戲?qū)崿F(xiàn)代碼

    java貪吃蛇游戲?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java貪吃蛇游戲?qū)崿F(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Java中用戶線程與守護(hù)線程的使用區(qū)別

    Java中用戶線程與守護(hù)線程的使用區(qū)別

    這篇文章主要介紹了Java中用戶線程與守護(hù)線程的使用區(qū)別,Java語言中無論是線程還是線程池,默認(rèn)都是用戶線程,因此用戶線程也被成為普通線程,下文關(guān)于其與守護(hù)線程的區(qū)別詳情,需要的小伙伴可以參考一下
    2022-05-05
  • jsp+servlet實現(xiàn)簡單登錄頁面功能(附demo)

    jsp+servlet實現(xiàn)簡單登錄頁面功能(附demo)

    本文主要介紹了jsp+servlet實現(xiàn)簡單登錄頁面功能登錄成功跳轉(zhuǎn)新頁面,登錄失敗在原登錄界面提示登錄失敗信息,對初學(xué)者有一定的幫助,感興趣的可以了解一下
    2021-07-07
  • Spring?Boot?實現(xiàn)?IP?限流的原理、實踐與利弊解析

    Spring?Boot?實現(xiàn)?IP?限流的原理、實踐與利弊解析

    在Spring?Boot中實現(xiàn)IP限流是一種簡單而有效的方式來保障系統(tǒng)的穩(wěn)定性和可用性,本文給大家介紹Spring?Boot實現(xiàn)IP限流:原理、實踐與利弊分析,感興趣的朋友跟隨小編一起看看吧
    2025-06-06
  • java 基于maven多模塊合并打包部署的操作過程

    java 基于maven多模塊合并打包部署的操作過程

    這篇文章主要介紹了java 基于maven多模塊合并打包部署的操作過程,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • redisson分布式限流RRateLimiter源碼解析

    redisson分布式限流RRateLimiter源碼解析

    這篇文章主要為大家介紹了redisson分布式限流RRateLimiter源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 關(guān)于Springboot+gateway整合依賴并處理依賴沖突問題

    關(guān)于Springboot+gateway整合依賴并處理依賴沖突問題

    這篇文章主要介紹了Springboot+gateway整合依賴并處理依賴沖突問題,給大家提到了spring boot版本和spring cloud版本,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01
  • 一篇文章帶你深入理解JVM虛擬機(jī)讀書筆記--鎖優(yōu)化

    一篇文章帶你深入理解JVM虛擬機(jī)讀書筆記--鎖優(yōu)化

    這篇文章深入介紹了JVM虛擬機(jī)的鎖優(yōu)化,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09

最新評論

厦门市| 上思县| 高要市| 新邵县| 日喀则市| 安泽县| 内黄县| 巫山县| 中山市| 都兰县| 朝阳区| 柳林县| 泰兴市| 汾西县| 广河县| 大新县| 桂平市| 岳西县| 普兰店市| 怀安县| 措勤县| 德令哈市| 西林县| 台安县| 壤塘县| 遂川县| 拜城县| 逊克县| 富川| 宁国市| 镇安县| 江永县| 聂拉木县| 灌云县| 嘉鱼县| 白水县| 平顶山市| 静安区| 临沭县| 仁化县| 渭南市|