實例詳解SpringBoot默認(rèn)的JSON解析方案
JSON(JavaScript Object Notation)是一種基于JavaScript語法子集的開放標(biāo)準(zhǔn)數(shù)據(jù)交換格式。JSON是基于文本的,輕量級的,通常被認(rèn)為易于讀/寫。
好了,廢話不多說,下面開始介紹如何在SpringBoot中使用JSON。
二、如何在SpringBoot中使用JSON在學(xué)習(xí)json之前,我們必須先了解一下HttpMessageConverter,其實看名字就知道,這是一個消息轉(zhuǎn)換工具。
下面我來介紹一下它的兩個功能:
1、將服務(wù)端返回的對象序列化成 JSON 字符串。
2、將前端傳來的 JSON 字符串反序列化成 Java 對象。
所有的 JSON 生成都離不開相關(guān)的 HttpMessageConverter。
SpringMVC 自動配置了 Jackson 和 Gson 的 HttpMessageConverter,Spring Boot 中又對此做了自動化配置,下面是兩者對應(yīng)源碼的路徑:
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration
所以,如果用戶使用 jackson 和 gson 的話,沒有其他額外配置,則只需要添加依賴即可。
三、舉例【第一步】老規(guī)矩,先創(chuàng)建一個SpringBoot項目。通過右邊的Maven可以看到,其實SpringBoot已經(jīng)將json集成進來了,Maven結(jié)構(gòu)如下圖:
【第二步】創(chuàng)建一個bean和一個controller類,具體項目結(jié)構(gòu)和代碼如下:
【項目結(jié)構(gòu)】
【User.java】
package com.mango.json.bean;import com.fasterxml.jackson.annotation.JsonFormat;import java.util.Date;public class User { private Integer id; private String username; private String address;public Integer getId() {return id; } public void setId(Integer id) {this.id = id; } public String getUsername() {return username; } public void setUsername(String username) {this.username = username; } public String getAddress() {return address; } public void setAddress(String address) {this.address = address; }}
【UserController.java】
package com.mango.json.controller;import com.mango.json.bean.User;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestController;import java.util.ArrayList;import java.util.Date;import java.util.List;@RestControllerpublic class UserController { @GetMapping('/user') public List<User> getUser() {List<User> userList = new ArrayList<>();for (int i = 0; i < 10; i++) { User user = new User(); user.setId(i); user.setUsername('mango>>>' + i); user.setAddress('www.mango.com>>>' + i); user.setBirthday(new Date()); userList.add(user);}return userList; }}
【運行結(jié)果】
注:大家可能和我顯示的效果不一樣,但是內(nèi)容肯定是一樣的,如果需要顯示成我這樣格式,需要給瀏覽器裝一款插件JSONView,這款插件就專門為json格式設(shè)計的,因為很復(fù)雜的json格式,是不容易閱讀的。
四、拓展上面就是SpringBoot中json的簡單用法,下面我會再針對json進行一點內(nèi)容的拓展。
1、如果碰到bean中有日期類型的屬性,json該怎么處理日期格式?
【第一種辦法】我們可以在該屬性上添加@JsonFormat(pattern = “yyyy-MM-dd”)注解,代碼如下:
package com.mango.json.bean;import com.fasterxml.jackson.annotation.JsonFormat;import java.util.Date;public class User { private Integer id; private String username; private String address;@JsonFormat(pattern = 'yyyy-MM-dd') private Date birthday; public Date getBirthday() {return birthday; } public void setBirthday(Date birthday) {this.birthday = birthday; } public Integer getId() {return id; } public void setId(Integer id) {this.id = id; } public String getUsername() {return username; } public void setUsername(String username) {this.username = username; } public String getAddress() {return address; } public void setAddress(String address) {this.address = address; }}
如果該bean中存在許多日期類型的屬性呢,這么做就不是那么合適了,所以,可以采用下面的第二種辦法。
【第二種辦法】大家都知道json肯定離不開ObjectMapper,因為json格式和java中的對象之間進行轉(zhuǎn)換就是通過ObjectMapper類,想深入研究的朋友可以看看這個類的源碼。
在上面我提到了SpringBoot自動化配置json,也給出了json源碼的路徑,大家可以進去看看,是否看到下面一段代碼,這就是它的核心之處。
@Configuration(proxyBeanMethods = false)@ConditionalOnClass(ObjectMapper.class)@ConditionalOnBean(ObjectMapper.class)@ConditionalOnProperty(name = HttpMessageConvertersAutoConfiguration.PREFERRED_MAPPER_PROPERTY,havingValue = 'jackson', matchIfMissing = true)static class MappingJackson2HttpMessageConverterConfiguration {@Bean@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class,ignoredType = {'org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter','org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter' })MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {return new MappingJackson2HttpMessageConverter(objectMapper);}}
其中,mappingJackson2HttpMessageConverter方法就是我們需要用到的,這是SpringBoot為我們默認(rèn)提供的,如果我們不重寫這個方法,默認(rèn)它就會生效,反之則失效。換句話說,我們不管是否重寫該方法,json我們都可以用。
既然我們現(xiàn)在有需求了,我們就重寫這個方法,具體代碼如下:
【W(wǎng)ebMvcConfig.java】
package com.mango.json.config;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import java.text.SimpleDateFormat;@Configurationpublic class WebMvcConfig { @Bean MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();ObjectMapper objectMapper = new ObjectMapper();objectMapper.setDateFormat(new SimpleDateFormat('yyyy-MM-dd'));converter.setObjectMapper(objectMapper);return converter; }}
注:重寫這個方法后,我們可以將bean中的注解@JsonFormat(pattern = “yyyy-MM-dd”)注釋掉,重啟項目即可。(如果大家有興趣,可以進行debug調(diào)試,看看默認(rèn)的方法是否還有效)
其實,大家可以從上面的代碼看到,我們真正對日期格式進行設(shè)置的是對ObjectMapper進行操作的,所以這段重寫的代碼是否可以精簡呢?答案是:當(dāng)然可以。
有心的朋友肯定留意到了,上面SpringBoot默認(rèn)提供的mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中,是存在ObjectMapper的,至于這個ObjectMapper是從哪里來的,大家可以根據(jù)下面路徑中的源碼看看:
【JacksonAutoConfiguration.java源碼路徑】
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
【具體源碼如下】
@Configuration(proxyBeanMethods = false)@ConditionalOnClass(Jackson2ObjectMapperBuilder.class)static class JacksonObjectMapperConfiguration {@Bean@Primary@ConditionalOnMissingBeanObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {return builder.createXmlMapper(false).build();}}
對,其實mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中ObjectMapper就是上面源碼中jacksonObjectMapper方法返回的ObjectMapper,大家可以debug試一下,看看是否正確。
廢話不多說了,下面我就重寫ObjectMapper,具體代碼如下:
【W(wǎng)ebMvcConfig.java】
package com.mango.json.config;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;import java.text.SimpleDateFormat;@Configurationpublic class WebMvcConfig { /*@Bean MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();ObjectMapper objectMapper = new ObjectMapper();objectMapper.setDateFormat(new SimpleDateFormat('yyyy-MM-dd'));converter.setObjectMapper(objectMapper);return converter; }*/ @Bean ObjectMapper objectMapper(){ObjectMapper objectMapper = new ObjectMapper();objectMapper.setDateFormat(new SimpleDateFormat('yyyy-MM-dd'));return objectMapper; }}
【運行結(jié)果】
注:因為上面兩種方法最后的結(jié)果都是一樣的,所以運行結(jié)果圖只放一張。
總結(jié)到此這篇關(guān)于SpringBoot默認(rèn)的JSON解析方案的文章就介紹到這了,更多相關(guān)SpringBoot默認(rèn)JSON解析內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. ASP常用日期格式化函數(shù) FormatDate()2. Python 操作 MySQL數(shù)據(jù)庫3. Python數(shù)據(jù)相關(guān)系數(shù)矩陣和熱力圖輕松實現(xiàn)教程4. 開發(fā)效率翻倍的Web API使用技巧5. bootstrap select2 動態(tài)從后臺Ajax動態(tài)獲取數(shù)據(jù)的代碼6. CSS3中Transition屬性詳解以及示例分享7. js select支持手動輸入功能實現(xiàn)代碼8. 什么是Python變量作用域9. vue使用moment如何將時間戳轉(zhuǎn)為標(biāo)準(zhǔn)日期時間格式10. python 如何在 Matplotlib 中繪制垂直線
