- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- SpringBoot默認JSON解析方案的示例分析
小編給大家分享一下SpringBoot默認JSON解析方案的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
JSON(JavaScript Object Notation)是一種基于JavaScript語(yǔ)法子集的開(kāi)放標準數據交換格式。JSON是基于文本的,輕量級的,通常被認為易于讀/寫(xiě)。
在學(xué)習json之前,我們必須先了解一下HttpMessageConverter,其實(shí)看名字就知道,這是一個(gè)消息轉換工具。
下面我來(lái)介紹一下它的兩個(gè)功能:
1、將服務(wù)端返回的對象序列化成 JSON 字符串。
2、將前端傳來(lái)的 JSON 字符串反序列化成 Java 對象。
所有的 JSON 生成都離不開(kāi)相關(guān)的 HttpMessageConverter。
SpringMVC 自動(dòng)配置了 Jackson 和 Gson 的 HttpMessageConverter,Spring Boot 中又對此做了自動(dòng)化配置,下面是兩者對應源碼的路徑:
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration
所以,如果用戶(hù)使用 jackson 和 gson 的話(huà),沒(méi)有其他額外配置,則只需要添加依賴(lài)即可。
【第一步】老規矩,先創(chuàng )建一個(gè)SpringBoot項目。通過(guò)右邊的Maven可以看到,其實(shí)SpringBoot已經(jīng)將json集成進(jìn)來(lái)了,Maven結構如下圖:
【第二步】創(chuàng )建一個(gè)bean和一個(gè)controller類(lèi),具體項目結構和代碼如下:
【項目結構】
【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; @RestController public 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; } }
【運行結果】
注:大家可能和我顯示的效果不一樣,但是內容肯定是一樣的,如果需要顯示成我這樣格式,需要給瀏覽器裝一款插件JSONView,這款插件就專(zhuān)門(mén)為json格式設計的,因為很復雜的json格式,是不容易閱讀的。
上面就是SpringBoot中json的簡(jiǎn)單用法,下面我會(huì )再針對json進(jìn)行一點(diǎn)內容的拓展。
1、如果碰到bean中有日期類(lèi)型的屬性,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中存在許多日期類(lèi)型的屬性呢,這么做就不是那么合適了,所以,可以采用下面的第二種辦法。
【第二種辦法】大家都知道json肯定離不開(kāi)ObjectMapper,因為json格式和java中的對象之間進(jìn)行轉換就是通過(guò)ObjectMapper類(lèi),想深入研究的朋友可以看看這個(gè)類(lèi)的源碼。
在上面我提到了SpringBoot自動(dòng)化配置json,也給出了json源碼的路徑,大家可以進(jìn)去看看,是否看到下面一段代碼,這就是它的核心之處。
@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為我們默認提供的,如果我們不重寫(xiě)這個(gè)方法,默認它就會(huì )生效,反之則失效。換句話(huà)說(shuō),我們不管是否重寫(xiě)該方法,json我們都可以用。
既然我們現在有需求了,我們就重寫(xiě)這個(gè)方法,具體代碼如下:
【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; @Configuration public 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; } }
注:重寫(xiě)這個(gè)方法后,我們可以將bean中的注解@JsonFormat(pattern = “yyyy-MM-dd”)注釋掉,重啟項目即可。(如果大家有興趣,可以進(jìn)行debug調試,看看默認的方法是否還有效)
其實(shí),大家可以從上面的代碼看到,我們真正對日期格式進(jìn)行設置的是對ObjectMapper進(jìn)行操作的,所以這段重寫(xiě)的代碼是否可以精簡(jiǎn)呢?答案是:當然可以。
有心的朋友肯定留意到了,上面SpringBoot默認提供的mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中,是存在ObjectMapper的,至于這個(gè)ObjectMapper是從哪里來(lái)的,大家可以根據下面路徑中的源碼看看:
【JacksonAutoConfiguration.java源碼路徑】
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
【具體源碼如下】
@Configuration(proxyBeanMethods = false) @ConditionalOnClass(Jackson2ObjectMapperBuilder.class) static class JacksonObjectMapperConfiguration { @Bean @Primary @ConditionalOnMissingBean ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { return builder.createXmlMapper(false).build(); } }
對,其實(shí)mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中ObjectMapper就是上面源碼中jacksonObjectMapper方法返回的ObjectMapper,大家可以debug試一下,看看是否正確。
廢話(huà)不多說(shuō)了,下面我就重寫(xiě)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; @Configuration public 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; } }
【運行結果】
注:因為上面兩種方法最后的結果都是一樣的,所以運行結果圖只放一張。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站