1. 程式人生 > 程式設計 >springboot jackson配置教程

springboot jackson配置教程

目錄
  • springboot jackson配置
    • 需求
    • 全域性配置
    • 額外
    • 測試
  • springboot配置jackSon處理欄位
    • Bean序列化為on
    • jackson處理相關自動

springboot jackson配置

專案中使用的json是jackson。這個呢是swww.cppcns.compring boot自帶的,一開UKuKBqjK始是用阿里的fastjson的。但是 總是有漏洞。還是用jackson,谷歌的gson也感覺非常棒。

需求

在controller 使用@RestController 返回json。使用的是 jackson。在處理BigDecimal的時候,想去掉 小數點後面的 00,例如 280.00.

全域性配置

這種需求 肯定是全域性配置一下了。看了一下文件,配置一下,感覺還可以 寫一下吧。

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
 * 建立時間: 2020/9/22 9:41
 */
@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper()
    {
        JsonMapper.Builder builder = JsonMapper.builder();
        // 通過該方法對mapper物件進行設定,所有序列化的物件都將按改規則進行系列化
        // 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字串包含未轉義的控制字元(值小於32的ASCII字元,包括製表符和換行符)www.cppcns.com
的特性。如果feature設定為false,則在遇到這樣的字元時丟擲異常。 builder.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS,true); //確定解析器是否允許使用單引號(撇號,字元'\ ")引用字串(名稱和字串值)的特性。如果是,這是除了其他可接受的標記。但不是JSON規範)。 builder.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES,true); JsonMapper jsonMapper = builder.build(); JavaTimeModule javaTimeModule = new JavaTimeModule(); //新增 序列器 這裡是對 BigDecimal 型別處理,這是關鍵程式碼 javaTimeModule.addSerializer(BigDecimal.class,new JsonSerializer<BigDecimal>() { @Override public void serialize(BigDecimal value,JsonGenerator gen,SerializerProvider serializers) throws IOException { DecimalFormat fnum = new DecimalFormat("#.##"); //把 這個BigDecimal 屬性對應的值,寫成 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 這個方法,用來處理對應型別的 轉化。註釋的很清楚,看不懂的可以留言問我。

額外

網上有好多上面是ObjectMapper 這個進行設定,這個呢裡面有不少是 標記過時的。 所以 我用了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 被轉成了 280。 好了,研究我的深度學習去了

springboot配置jackSon處理欄位

常用框架:阿里,fastjson,谷歌,gson等。

javaBean序列化為json

① 效能:Jackson > Fastjson > Gson > Json-lib同個結構

② Jackson、Fastjson、Gson 類庫各有特點,各有自己的專長

③ 空間換時間,時間換空間

jackson處理相關自動

① 指定欄位不返回:@jsonIgnore(主要用於密碼,讓密碼不顯示,加在欄位上面)

② 指定日期格式:@JsonFormat(pattern = “yyyy-MM-dd hh:mm:ss”,locale = “zh”,timezone = “GMT+8”)

③ 空欄位不返回:@JsonInclude(JsonInclude.Include.NON_NULL)

③ 指定別名:@JsonProperty(“create_time”)

開發功能:視訊建立時候返回自定義格式,過濾使用者敏感資訊。

 private http://www.cppcns.comint 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;

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。