1. 程式人生 > 程式設計 >例項詳解SpringBoot預設的JSON解析方案

例項詳解SpringBoot預設的JSON解析方案

目錄
  • 一、什麼是ON
  • 二、如何在SpringBoot中使用JSON
  • 三、舉例
  • 四、拓展
  • 總結

一、什麼是JSON

JSON( Object Notation)是一種基於Script語法子集的開放標準資料交換格式。JSON是基於文字的,輕量級的,通常被認為易於讀/寫。

好了,廢話不多說,下面開始介紹如何在SpringBoot中使用JSON。

二、如何在SpringBoot中使用JSON

在學習json之前,我們必須先了解一下HttpMessageConverter,其實看名字就知道,這是一個訊息轉換工具。

下面我來介紹一下它的兩個功能:

1、將服務端返回的物件序列化成 JSON 字串。

2、將前端傳來的 JSON 字串反序列化成 Java 物件。

所有的 JSON 生成都離不開相關的 HttpMessageConverter。

SpringMVC 自動配置了 Jackson 和 Gson 的 HttpMessageConverter,Spring Boot 中又對此做了自動化配置,下面是兩者對應原始碼的路徑:

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

所以,如果使用者使用 jackson 和 gson 的話,沒有其他額外配置,則只需要新增依賴即可。

三、舉例

第一步】老規矩,先建立一個SpringBoot專案。通過右邊的Maven可以看到,其實SpringBoot已經將json整合進來了,Maven結構如下圖:

例項詳解SpringBoot預設的JSON解析方案

第二步】建立一個bean和一個controller類,具體專案結構和程式碼如下:

【專案結構】

例項詳解SpringBoot預設的JSON解析方案

【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 jBSxkVava.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;
    }
}

【執行結果】

例項詳解SpringBoot預設的JSON解析方案

注:大家可能和我顯示的效果不一樣,但是內容肯定是一樣的,如果需要顯示成我這樣格式,需要給瀏覽器裝一款外掛JSONVBSxkView,這款外掛就專門為json格式設計的,因為很複雜的json格式,是不容易閱讀的。

四、拓展

上面就是SpringBoot中json的簡單用法,下面我會再針對json進行一點內容的拓展。

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中的物件之間進http://www.cppcns.com行轉換就是通過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為我們預設提供的,如果我們不重寫這個方法,預設它就會生效,反之則失效。換句話說,我們不管是否重寫該方法,json我們都可以用。

既然我們現在有需求了,我們就重寫這個方法,具體程式碼如下:

【WebMvcConfig.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中的註解@Jsonwww.cppcns.comFormat(pattern = “yyyy-MM-dd”)註釋掉,重啟專案即可。(如果大家有興趣,可以進行debug除錯,看看預設的方法是否還有效)

其實,大家可以從上面的程式碼看到,我們真正對日期格式進行設定的是對ObjectMapper進行操作的,所以這段重寫的程式碼是否可以精簡呢?答案是:當然可以。

有心的朋友肯定留意到了,上面SpringBoot預設提供的mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中,是存在ObjectMapper的,至於這個ObjectMapper是從哪裡來的,大家可以根據下面路徑中的原始碼看看:

【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();
		}

	}

對,其實mappingJackson2HttpMessageConverter(ObjectMapper objectMapper)方法中ObjectMapper就是上面原始碼中jacksonObjectMapper方法返回的ObjectMapper,大家可以debug試一下,看看是否正確。

廢話不多說了,下面我就重寫ObjectMapper,具體程式碼如下:

【WebMvcConfig.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;
    }
}

【執行結果】

例項詳解SpringBoot預設的JSON解析方案

注:因為上面兩種方法最後的結果都是一樣的,所以執行結果圖只放一張。

總結

到此這篇關於SpringBoot預設的JSON解析方案的文章就介紹到這了,更多相關SpringBoot預設JSON解析內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!