Spring Boot系列-json框架jackson配置詳解
-
T1 - 前言
目前Java最常見的3中JSON操作框架分別爲Gson、Jackson、FastJson,該篇文章主要講解jackson在SpringBoot環境中各配置項的具體作用。
-
T2 - 環境依賴
jackson是spring-boot的web/webflux框架默認依賴的json庫,要使用SpringBoot的jackson自動化配置只需保證SpringBoot的web/webflux依賴引入。下文配置demo爲了方便調試引入了個人的swagger配置框架:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- swagger自動配置依賴,爲方便測試 --> <dependency> <groupId>io.github.wilson-he</groupId> <artifactId>swagger2-spring-boot-starter</artifactId> </dependency> </dependencies>
-
T3 - application.yml樣例講解
spring: jackson: # 設置屬性命名策略,對應jackson下PropertyNamingStrategy中的常量值,SNAKE_CASE-返回的json駝峯式轉下劃線,json body下劃線傳到後端自動轉駝峯式 property-naming-strategy: SNAKE_CASE # 全局設置@JsonFormat的格式pattern date-format: yyyy-MM-dd HH:mm:ss # 當地時區 locale: zh # 設置全局時區 time-zone: GMT+8 # 常用,全局設置pojo或被@JsonInclude註解的屬性的序列化方式 default-property-inclusion: NON_NULL #不爲空的屬性纔會序列化,具體屬性可看JsonInclude.Include # 常規默認,枚舉類SerializationFeature中的枚舉屬性爲key,值爲boolean設置jackson序列化特性,具體key請看SerializationFeature源碼 serialization: WRITE_DATES_AS_TIMESTAMPS: true # 返回的java.util.date轉換成timestamp FAIL_ON_EMPTY_BEANS: true # 對象爲空時是否報錯,默認true # 枚舉類DeserializationFeature中的枚舉屬性爲key,值爲boolean設置jackson反序列化特性,具體key請看DeserializationFeature源碼 deserialization: # 常用,json中含pojo不存在屬性時是否失敗報錯,默認true FAIL_ON_UNKNOWN_PROPERTIES: false # 枚舉類MapperFeature中的枚舉屬性爲key,值爲boolean設置jackson ObjectMapper特性 # ObjectMapper在jackson中負責json的讀寫、json與pojo的互轉、json tree的互轉,具體特性請看MapperFeature,常規默認即可 mapper: # 使用getter取代setter探測屬性,如類中含getName()但不包含name屬性與setName(),傳輸的vo json格式模板中依舊含name屬性 USE_GETTERS_AS_SETTERS: true #默認false # 枚舉類JsonParser.Feature枚舉類中的枚舉屬性爲key,值爲boolean設置jackson JsonParser特性 # JsonParser在jackson中負責json內容的讀取,具體特性請看JsonParser.Feature,一般無需設置默認即可 parser: ALLOW_SINGLE_QUOTES: true # 是否允許出現單引號,默認false # 枚舉類JsonGenerator.Feature枚舉類中的枚舉屬性爲key,值爲boolean設置jackson JsonGenerator特性,一般無需設置默認即可 # JsonGenerator在jackson中負責編寫json內容,具體特性請看JsonGenerator.Feature swagger: enabled: true docket: base-package: io.github
-
T4 - 測試樣例
application.yml
spring: jackson: # 常用請求與響應自動轉下劃線,空值字段不傳輸 property-naming-strategy: SNAKE_CASE default-property-inclusion: non_null swagger: docket: base-package: io.github.jackson enabled: true
CompanyVO.java
/** * CompanyVO * * @author Wilson * @date 2019/4/21 */ @Data @Accessors(chain = true) public class CompanyVO { private String companyName; @JsonFormat private Date createTime; private Integer employeeNum; }
CompanyController.java
@RestController @RequestMapping("/company") @Api public class CompanyController { @Resource private ObjectMapper objectMapper; @PostMapping("/") public CompanyVO post(@RequestBody CompanyVO vo) { return vo; } @GetMapping("/") public String objectToJson() throws JsonProcessingException { // 使用jackson的objectMapper將對象根據SNAKE_CASE策略轉成json字符串 return objectMapper.writeValueAsString(new CompanyVO().setCompanyName("company").setEmployeeNum(11)); } }
樣例測試效果圖:
- 請求參數需傳下劃線,駝峯式無效(阿里、微信等大部分接口都是以下滑線傳參,所以個人推薦使用SNAKE_CASE策略)
- 響應結果轉下劃線,空屬性不轉json(傳參圖沒傳employeeNum)
[外鏈圖片轉存失敗(img-tE4fpZ0E-1564386933900)(https://github.com/Wilson-He/pictures/blob/master/blog/spring-boot/jackson/response.png?raw=true)] - Spring容器jackson的ObjectMapper將對象轉json時根據SNAKE_CASE策略,當要把對象轉成json字符串請求第三方接口或以對象接收第三方接口參數時就無需考慮下劃線適配轉換的問題了
[外鏈圖片轉存失敗(img-NE7pBuDJ-1564386933902)(https://github.com/Wilson-He/pictures/blob/master/blog/spring-boot/jackson/objectToJson.png?raw=true)] -
附
個人swagger2-spring-boot-starter配置詳解
本文章樣例spring-boot-jackson-demo git地址
- 請求參數需傳下劃線,駝峯式無效(阿里、微信等大部分接口都是以下滑線傳參,所以個人推薦使用SNAKE_CASE策略)