1. 程式人生 > 其它 >SpringBoot - 實現返回 JSON 資料

SpringBoot - 實現返回 JSON 資料

技術標籤: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之外,還有Gsonfastjson。

1、使用Gson

(1)、新增依賴

GsonGoogle的一個開源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中。不同於Gsonfastjson繼承完成之後並不能立馬使用,需要開發者提供相應的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)、重啟訪問