springboot jackson配置教程
springboot jackson配置
項目中使用的json是jackson。這個呢是spring boot自帶的,一開始是用阿里的fastjson的。但是 總是有漏洞。還是用jackson,谷歌的gson也感覺非常棒。
需求
在controller 使用@RestController 返回json。使用的是 jackson。在處理BigDecimal的時候,想去掉 小數(shù)點后面的 00,例如 280.00.
全局配置
這種需求 肯定是全局配置一下了??戳艘幌挛臋n,配置一下,感覺還可以 寫一下吧。
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.json.JsonReadFeature; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import java.io.IOException; import java.math.BigDecimal; import java.text.DecimalFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; /** * @Author: plani * 創(chuàng)建時間: 2020/9/22 9:41 */ @Configuration public class JacksonConfig { @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper() { JsonMapper.Builder builder = JsonMapper.builder(); // 通過該方法對mapper對象進行設(shè)置,所有序列化的對象都將按改規(guī)則進行系列化 // Include.Include.ALWAYS 默認 // Include.NON_DEFAULT 屬性為默認值不序列化 // Include.NON_EMPTY 屬性為 空("") 或者為 NULL 都不序列化,則返回的json是沒有這個字段的。這樣對移動端會更省流量 // Include.NON_NULL 屬性為NULL 不序列化 builder.serializationInclusion(JsonInclude.Include.NON_EMPTY); //有未知屬性 要不要拋異常 builder.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //是否允許JSON字符串包含未轉(zhuǎn)義的控制字符(值小于32的ASCII字符,包括制表符和換行符)的特性。如果feature設(shè)置為false,則在遇到這樣的字符時拋出異常。 builder.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS, true); //確定解析器是否允許使用單引號(撇號,字符'\ ")引用字符串(名稱和字符串值)的特性。如果是,這是除了其他可接受的標記。但不是JSON規(guī)范)。 builder.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true); JsonMapper jsonMapper = builder.build(); JavaTimeModule javaTimeModule = new JavaTimeModule(); //添加 序列器 這里是對 BigDecimal 類型處理,這是關(guān)鍵代碼 javaTimeModule.addSerializer(BigDecimal.class, new JsonSerializer<BigDecimal>() { @Override public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException { DecimalFormat fnum = new DecimalFormat("#.##"); //把 這個BigDecimal 屬性對應(yīng)的值,寫成 String 類型 gen.writeString(fnum.format(value)); } }); //處理 時間格式 javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); //注冊 jsonMapper.registerModule(javaTimeModule); return jsonMapper; } }
上面最重要的 就是 addSerializer 這個方法,用來處理對應(yīng)類型的 轉(zhuǎn)化。注釋的很清楚,看不懂的可以留言問我。
額外
網(wǎng)上有好多上面是ObjectMapper 這個進行設(shè)置,這個呢里面有不少是 標記過時的。 所以 我用了JsonMapper
測試
寫一個 controller 方法,返回含有BigDecimal的類,來測試一下
@PostMapping("test") public Map test() { Map<String, Object> map = new HashMap<>(); BigDecimal bigDecimal = new BigDecimal("280.00"); map.put("one", bigDecimal); return map; }
用postman測試一下
可以看見 280.00 被轉(zhuǎn)成了 280。 好了,研究我的深度學(xué)習(xí)去了
springboot配置jackSon處理字段
常用框架:阿里,fastjson,谷歌,gson等。
javaBean序列化為json
① 性能:Jackson > Fastjson > Gson > Json-lib同個結(jié)構(gòu)
② Jackson、Fastjson、Gson 類庫各有特點,各有自己的專長
③ 空間換時間,時間換空間
jackson處理相關(guān)自動
① 指定字段不返回:@jsonIgnore(主要用于密碼,讓密碼不顯示,加在字段上面)
② 指定日期格式:@JsonFormat(pattern = “yyyy-MM-dd hh:mm:ss”,locale = “zh”,timezone = “GMT+8”)
③ 空字段不返回:@JsonInclude(JsonInclude.Include.NON_NULL)
③ 指定別名:@JsonProperty(“create_time”)
開發(fā)功能:視頻創(chuàng)建時候返回自定義格式,過濾用戶敏感信息。
private int price; @JsonProperty("cover_img") private String coverImg; @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",locale = "zh",timezone = "GMT+8") @JsonProperty("create_time") private Date createTime; @JsonInclude(JsonInclude.Include.NON_NULL) private List<Chapter> chapterList;
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
java使用compareTo實現(xiàn)一個類的對象之間比較大小操作
這篇文章主要介紹了java使用compareTo實現(xiàn)一個類的對象之間比較大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09JAVA多線程實現(xiàn)生產(chǎn)者消費者的實例詳解
這篇文章主要介紹了JAVA多線程實現(xiàn)生產(chǎn)者消費者的實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06MyBatis入門之增刪改查+數(shù)據(jù)庫字段和實體字段不一致問題處理方法
這篇文章主要介紹了MyBatis入門之增刪改查+數(shù)據(jù)庫字段和實體字段不一致問題處理方法,需要的朋友可以參考下2017-05-05了解java中的Clojure如何抽象并發(fā)性和共享狀態(tài)
Clojure是一種運行在Java平臺上的 Lisp 方言,Lisp是一種以表達性和功能強大著稱的編程語言,但人們通常認為它不太適合應(yīng)用于一般情況,而Clojure的出現(xiàn)徹底改變了這一現(xiàn)狀。,需要的朋友可以參考下2019-06-06SpringMVC實現(xiàn)參數(shù)校驗配置方法
這篇文章主要介紹了SpringMVC實現(xiàn)參數(shù)校驗的配置方式,Spring MVC會拋出MethodArgumentNotValidException異常,并將錯誤信息綁定到相應(yīng)的字段上,感興趣的朋友跟隨小編一起看看吧2024-03-03詳解Java執(zhí)行g(shù)roovy腳本的兩種方式
這篇文章主要介紹了Java執(zhí)行g(shù)roovy腳本的兩種方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04Dwr3.0純注解(純Java Code配置)配置與應(yīng)用淺析三之后端反向調(diào)用前端
Dwr是為人所熟知的前端框架,其異步推送功能是為人所津津樂道的,下來主要研究一下它的這個功能是怎么應(yīng)用的;2016-04-04