欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

實(shí)例詳解SpringBoot默認(rèn)的JSON解析方案

 更新時(shí)間:2021年08月16日 16:17:28   作者:我要大芒果  
JSON數(shù)據(jù)現(xiàn)在是我們開發(fā)中用的最多的,百分之九十的數(shù)據(jù)都是通過JSON方式進(jìn)行傳輸,下面這篇文章主要給大家介紹了關(guān)于SpringBoot默認(rèn)的JSON解析方案的相關(guān)資料,需要的朋友可以參考下

一、什么是JSON

JSON(JavaScript Object Notation)是一種基于JavaScript語(yǔ)法子集的開放標(biāo)準(zhǔn)數(shù)據(jù)交換格式。JSON是基于文本的,輕量級(jí)的,通常被認(rèn)為易于讀/寫。

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

二、如何在SpringBoot中使用JSON

在學(xué)習(xí)json之前,我們必須先了解一下HttpMessageConverter,其實(shí)看名字就知道,這是一個(gè)消息轉(zhuǎn)換工具。

下面我來介紹一下它的兩個(gè)功能:

1、將服務(wù)端返回的對(duì)象序列化成 JSON 字符串。

2、將前端傳來的 JSON 字符串反序列化成 Java 對(duì)象。

所有的 JSON 生成都離不開相關(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 的話,沒有其他額外配置,則只需要添加依賴即可。

三、舉例

第一步】老規(guī)矩,先創(chuàng)建一個(gè)SpringBoot項(xiàng)目。通過右邊的Maven可以看到,其實(shí)SpringBoot已經(jīng)將json集成進(jìn)來了,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肯定離不開ObjectMapper,因?yàn)閖son格式和java中的對(duì)象之間進(jìn)行轉(zhuǎn)換就是通過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ì)生效,反之則失效。換句話說,我們不管是否重寫該方法,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是從哪里來的,大家可以根據(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試一下,看看是否正確。

廢話不多說了,下面我就重寫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注解的類型知識(shí)點(diǎn)總結(jié)

    java注解的類型知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于java注解的類型知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • ThreadLocal作用原理與內(nèi)存泄露示例解析

    ThreadLocal作用原理與內(nèi)存泄露示例解析

    這篇文章主要為大家介紹了ThreadLocal作用原理與內(nèi)存泄露示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Java二維碼登錄流程實(shí)現(xiàn)代碼(包含短地址生成,含部分代碼)

    Java二維碼登錄流程實(shí)現(xiàn)代碼(包含短地址生成,含部分代碼)

    近年來,二維碼的使用越來越風(fēng)生水起,本篇文章主要介紹了Java二維碼登錄流程實(shí)現(xiàn)代碼,其中包含短地址生成,有興趣的可以了解一下。
    2016-12-12
  • Spring?Boot中使用Spring?MVC的示例解析

    Spring?Boot中使用Spring?MVC的示例解析

    MVC?是一種常見的軟件設(shè)計(jì)模式,用于分離應(yīng)用程序的不同部分以實(shí)現(xiàn)松散耦合和高內(nèi)聚性,這篇文章主要介紹了如何在Spring?Boot中使用Spring?MVC,需要的朋友可以參考下
    2023-04-04
  • java編程ThreadLocal上下傳遞源碼解析

    java編程ThreadLocal上下傳遞源碼解析

    這篇文章主要為大家介紹了java編程中ThreadLocal提供的上下傳遞方式的源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • Java字符串拼接效率測(cè)試過程解析

    Java字符串拼接效率測(cè)試過程解析

    這篇文章主要介紹了Java字符串拼接效率測(cè)試過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Java Map集合與Collection類的使用詳解

    Java Map集合與Collection類的使用詳解

    這篇文章主要介紹了Java Map集合的使用及Collection工具類使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • Java的三種代理模式簡(jiǎn)述

    Java的三種代理模式簡(jiǎn)述

    這篇文章主要簡(jiǎn)述Java的三種代理模式,java的代理模式主要包括靜態(tài)代理、動(dòng)態(tài)代理、Cglib代理,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Java中有界隊(duì)列的飽和策略(reject policy)原理解析

    Java中有界隊(duì)列的飽和策略(reject policy)原理解析

    這篇文章主要介紹了Java中有界隊(duì)列的飽和策略(reject policy)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java JDK11基于嵌套的訪問控制的實(shí)現(xiàn)

    Java JDK11基于嵌套的訪問控制的實(shí)現(xiàn)

    這篇文章主要介紹了Java JDK11基于嵌套的訪問控制的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01

最新評(píng)論