SpringBoot - 實現返回 JSON 資料
阿新 • • 發佈:2020-12-30
技術標籤:SpringBootspring bootjson
JSON是目前主流的前後端資料傳輸方式,尤其是現在前後端分離模式的盛行,後端返回JSON格式資料更是主流。在Spring Boot專案中,只要添加了Web依賴(spring-boot-starter-web),就可以很方便地實現JSON轉換。
一、預設實現
Web依賴預設加入了jackson-databind作為JSON處理器,我們不需要要新增額外的JSON處理器就可以返回一段JSON。例項演示:
1、建立實體類
public class User { private String username; @JsonIgnore private String password; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime register; // 省略 setter getter 方法 }
- @JsonIgnore:json序列化時將java bean中的一些屬性忽略掉。即生成json時不生成其標註的屬性。
- @JsonFormat:將日期型別的資料格式化成指定格式的字串。
2、建立 Controller
在這個Contoller中我們初始化一個User 物件,然後將其直接返回。
@Controller public class UserController { @GetMapping("/user") @ResponseBody public User user(){ User user = new User(); user.setPassword("123456"); user.setUsername("admin"); user.setRegister(LocalDateTime.now()); return user; } }
- 返回 JSON格式資料 小在方法上新增 @ResponseBody註解,
- 如果不想在每個方式上都新增@ResponseBody註解,那麼可以採用@RestController組合註解代替@Controller和@ResponseBody
3、啟動服務,測試結果
二、自定義轉換器
常見的JSON處理器除了jackson-databind之外,還有Gson和fastjson。
1、使用Gson
(1)、新增依賴
Gson是Google的一個開源JSON解析框架。使用Gson,需要先除去預設的jackson-databind,然後加入Gson依賴,程式碼如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 移除jackson-databind 的依賴--> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency> <!-- 新增 GSON 依賴 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency>
- Spring Boot中預設提供了Gson的自動轉換類GsonHttpMessageConvertersConfiguration,因此Gson的依賴新增成功後,可以像使用jackson-databind那樣直接使用了。
- 但Gson進行轉換時,如果想對日期資料進行格式化,那麼還需要開發者自定義HttpMessageConverter。
(2)、自定義HttpMessageConverter
@Configuration
public class GsonConfig {
@Bean
public HttpMessageConverter httpMessageConverter(){
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
GsonBuilder builder = new GsonBuilder();
//反序列化 LocalDateTime
builder.registerTypeAdapter(LocalDateTime.class, (JsonSerializer<LocalDateTime>) (src, typeOfSrc, context) -> {
String format = src.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
return new JsonPrimitive(format);
});
// 解析 Date型別
builder.setDateFormat("yyyy-MM-dd HH:mm:ss");
//解析時修飾符為protected的欄位被過濾掉
builder.excludeFieldsWithModifiers(Modifier.PROTECTED);
Gson gson = builder.create();
converter.setGson(gson);
return converter;
}
}
(3)、重啟服務訪問
2、使用fastjson
fastjson是阿里巴巴的一個開源JSON解析框架,是目前JSON解析速度最快的開源框架,該框架也可以整合到Spring Boot中。不同於Gson,fastjson繼承完成之後並不能立馬使用,需要開發者提供相應的HttpMessageConverter後才能使用,整合fastjson的步驟如下
(1)、新增依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 移除jackson-databind 的依賴-->
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
(2)、自定義HttpMessageConverter
@Configuration
public class CustomerFastJsonConfig {
@Bean
public HttpMessageConverter httpMessageConverter(){
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
config.setDateFormat("yyyy-MM-dd HH:mm:ss");
config.setSerializerFeatures(
SerializerFeature.WriteClassName,
SerializerFeature.WriteMapNullValue,
SerializerFeature.PrettyFormat,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteNullStringAsEmpty
);
converter.setFastJsonConfig(config);
return converter;
}
}
- 可以通過在屬性上新增 @JSONField(serialize=false) 註解排除某個屬性序列化,類似於 jackson 中的@JsonIgnore 註解
(3)、重啟訪問