實(shí)例詳解SpringBoot默認(rèn)的JSON解析方案
一、什么是JSON
JSON(JavaScript Object Notation)是一種基于JavaScript語(yǔ)法子集的開(kāi)放標(biāo)準(zhǔn)數(shù)據(jù)交換格式。JSON是基于文本的,輕量級(jí)的,通常被認(rèn)為易于讀/寫。
好了,廢話不多說(shuō),下面開(kāi)始介紹如何在SpringBoot中使用JSON。
二、如何在SpringBoot中使用JSON
在學(xué)習(xí)json之前,我們必須先了解一下HttpMessageConverter,其實(shí)看名字就知道,這是一個(gè)消息轉(zhuǎn)換工具。
下面我來(lái)介紹一下它的兩個(gè)功能:
1、將服務(wù)端返回的對(duì)象序列化成 JSON 字符串。
2、將前端傳來(lái)的 JSON 字符串反序列化成 Java 對(duì)象。
所有的 JSON 生成都離不開(kāi)相關(guān)的 HttpMessageConverter。
SpringMVC 自動(dòng)配置了 Jackson 和 Gson 的 HttpMessageConverter,Spring Boot 中又對(duì)此做了自動(dòng)化配置,下面是兩者對(duì)應(yīng)源碼的路徑:
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.GsonHttpMessageConvertersConfiguration
所以,如果用戶使用 jackson 和 gson 的話,沒(méi)有其他額外配置,則只需要添加依賴即可。
三、舉例
【第一步】老規(guī)矩,先創(chuàng)建一個(gè)SpringBoot項(xiàng)目。通過(guò)右邊的Maven可以看到,其實(shí)SpringBoot已經(jīng)將json集成進(jìn)來(lái)了,Maven結(jié)構(gòu)如下圖:

【第二步】創(chuàng)建一個(gè)bean和一個(gè)controller類,具體項(xiàng)目結(jié)構(gòu)和代碼如下:
【項(xiàng)目結(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;
@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;
}
}
【運(yùn)行結(jié)果】

注:大家可能和我顯示的效果不一樣,但是內(nèi)容肯定是一樣的,如果需要顯示成我這樣格式,需要給瀏覽器裝一款插件JSONView,這款插件就專門為json格式設(shè)計(jì)的,因?yàn)楹軓?fù)雜的json格式,是不容易閱讀的。
四、拓展
上面就是SpringBoot中json的簡(jiǎn)單用法,下面我會(huì)再針對(duì)json進(jìn)行一點(diǎn)內(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肯定離不開(kāi)ObjectMapper,因?yàn)閖son格式和java中的對(duì)象之間進(jìn)行轉(zhuǎn)換就是通過(guò)ObjectMapper類,想深入研究的朋友可以看看這個(gè)類的源碼。
在上面我提到了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為我們默認(rèn)提供的,如果我們不重寫這個(gè)方法,默認(rèn)它就會(huì)生效,反之則失效。換句話說(shuō),我們不管是否重寫該方法,json我們都可以用。
既然我們現(xiàn)在有需求了,我們就重寫這個(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;
}
}
注:重寫這個(gè)方法后,我們可以將bean中的注解@JsonFormat(pattern = “yyyy-MM-dd”)注釋掉,重啟項(xiàng)目即可。(如果大家有興趣,可以進(jìn)行debug調(diào)試,看看默認(rèn)的方法是否還有效)
其實(shí),大家可以從上面的代碼看到,我們真正對(duì)日期格式進(jìn)行設(shè)置的是對(duì)ObjectMapper進(jìn)行操作的,所以這段重寫的代碼是否可以精簡(jiǎn)呢?答案是:當(dāng)然可以。
有心的朋友肯定留意到了,上面SpringBoot默認(rèn)提供的mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中,是存在ObjectMapper的,至于這個(gè)ObjectMapper是從哪里來(lái)的,大家可以根據(jù)下面路徑中的源碼看看:
【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();
}
}
對(duì),其實(shí)mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中ObjectMapper就是上面源碼中jacksonObjectMapper方法返回的ObjectMapper,大家可以debug試一下,看看是否正確。
廢話不多說(shuō)了,下面我就重寫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;
}
}
【運(yùn)行結(jié)果】

注:因?yàn)樯厦鎯煞N方法最后的結(jié)果都是一樣的,所以運(yùn)行結(jié)果圖只放一張。
總結(jié)
到此這篇關(guān)于SpringBoot默認(rèn)的JSON解析方案的文章就介紹到這了,更多相關(guān)SpringBoot默認(rèn)JSON解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java?IO及BufferedReader.readline()出現(xiàn)的Bug
這篇文章主要介紹了Java?IO及BufferedReader.readline()出現(xiàn)的Bug,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
詳解基于java的Socket聊天程序——初始設(shè)計(jì)(附demo)
本篇文章主要介紹了Socket聊天程序——初始設(shè)計(jì)(附demo),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
Intellij Idea中批量導(dǎo)入第三方j(luò)ar包的全過(guò)程
引入jar包一般都是針對(duì)小的java項(xiàng)目,這篇文章主要給大家介紹了關(guān)于Intellij Idea中批量導(dǎo)入第三方j(luò)ar包的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10
SpringBoot?@Transactional事務(wù)不生效排查方式
這篇文章主要介紹了SpringBoot?@Transactional事務(wù)不生效排查方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java?Spring?boot?配置JDK和MAVEN開(kāi)發(fā)環(huán)境的過(guò)程
本文詳細(xì)介紹了如何配置JDK和Maven環(huán)境,包括JDK的安裝與環(huán)境變量設(shè)置,Maven的下載、配置環(huán)境變量和設(shè)置阿里云倉(cāng)庫(kù),最后簡(jiǎn)述了在IntelliJ?IDEA中配置JDK和Maven的步驟,本教程適合Java開(kāi)發(fā)新手進(jìn)行開(kāi)發(fā)環(huán)境的搭建,確保順利進(jìn)行Java項(xiàng)目的開(kāi)發(fā)2024-11-11
SpringBoot中操作Bean的生命周期的方法總結(jié)
在SpringBoot應(yīng)用中,管理和操作Bean的生命周期是一項(xiàng)關(guān)鍵的任務(wù),這不僅涉及到如何創(chuàng)建和銷毀Bean,還包括如何在應(yīng)用的生命周期中對(duì)Bean進(jìn)行精細(xì)控制,本文給大家總結(jié)了SpringBoot中操作Bean的生命周期的方法,需要的朋友可以參考下2023-12-12
詳解Spring Data Jpa當(dāng)屬性為Null也更新的完美解決方案
這篇文章主要介紹了詳解Spring Data Jpa當(dāng)屬性為Null也更新的完美解決方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02

