最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot如何返回Json數(shù)據(jù)格式

 更新時間:2023年03月22日 17:07:40   作者:程序員史迪仔  
這篇文章主要介紹了SpringBoot如何返回Json數(shù)據(jù)格式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

一、@RestController 注解

在 Spring Boot 中的 Controller 中使用 @RestController 注解即可返回 JSON 格式的數(shù)據(jù)。

  • @RestController 注解包含了 @Controller 和 @ResponseBody 注解。
  • @ResponseBody 注解是將返回的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為 JSON 格式。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    String value() default "";
}

二、Jackson

在 Spring Boot 中默認使用的 JSON 解析技術(shù)框架是 Jackson。

點開 pom.xml 中的 spring-boot-starter-web 依賴,可以看到 spring-boot-starter-json 依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-json</artifactId>
    <version>2.0.3.RELEASE</version>
    <scope>compile</scope>
</dependency>

再次點進去上面提到的 spring-boot-starter-json 依賴,可以看到如下代碼:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.6</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jdk8</artifactId>
    <version>2.9.6</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.9.6</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
    <version>2.9.6</version>
    <scope>compile</scope>
</dependency>

到此為止,可以知道 Spring Boot 中默認使用的 JSON 解析框架是 Jackson。

1、對象、List、Map 轉(zhuǎn)換為Json格式

創(chuàng)建實體類:

public class User {
    private Long id;
    private String username;
    private String password;
    /* 省略get、set和帶參構(gòu)造方法 */
}

Controller 層

import com.itcodai.course02.entity.User;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/json")
public class JsonController {

    @RequestMapping("/user")
    public User getUser() {
        return new User(1, "倪升武", "123456");
        //返回 {"id":1,"username":"倪升武","password":"123456"}
    }

    @RequestMapping("/list")
    public List<User> getUserList() {
        List<User> userList = new ArrayList<>();
        User user1 = new User(1, "倪升武", "123456");
        User user2 = new User(2, "達人課", "123456");
        userList.add(user1);
        userList.add(user2);
        return userList;
        //返回 [{"id":1,"username":"倪升武","password":"123456"},{"id":2,"username":"達人課","password":"123456"}]

    }

    @RequestMapping("/map")
    public Map<String, Object> getMap() {
        Map<String, Object> map = new HashMap<>(3);
        User user = new User(1, "倪升武", "123456");
        map.put("作者信息", user);
        map.put("博客地址", "http://blog.itcodai.com");
        map.put("CSDN地址", "http://blog.csdn.net/eson_15");
        map.put("粉絲數(shù)量", 4153);
        return map;
        //返回 {"作者信息":{"id":1,"username":"倪升武","password":"123456"},"CSDN地址":"http://blog.csdn.net/eson_15","粉絲數(shù)量":4153,"博客地址":"http://blog.itcodai.com"}

    }
}

2、Jackson 的配置類

在轉(zhuǎn) JSON 格式的時候?qū)⑺械?null 轉(zhuǎn)換為 “” 的配置

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
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 org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.io.IOException;

@Configuration
public class JacksonConfig {
    @Bean
    @Primary
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

// 修改一下上面返回 Map 的接口,將幾個值改成 null 測試一下:

@RequestMapping("/map")
public Map<String, Object> getMap() {
    Map<String, Object> map = new HashMap<>(3);
    User user = new User(1, "倪升武", null);
    map.put("作者信息", user);
    map.put("博客地址", "http://blog.itcodai.com");
    map.put("CSDN地址", null);
    map.put("粉絲數(shù)量", 4153);
    return map;
	// 返回 {"作者信息":{"id":1,"username":"倪升武","password":""},"CSDN地址":"","粉絲數(shù)量":4153,"博客地址":"http://blog.itcodai.com"}
	// 可以看到 Jackson 已經(jīng)將所有 null 字段轉(zhuǎn)成空字符串了。
}

三、Fastjson

Fastjson 是阿里巴巴開源的。

Jackson 和 fastjson 有哪些區(qū)別?

從擴展上來看,fastjson 沒有 Jackson 靈活,從速度或者上手難度來看,fastjson 可以考慮,它也比較方便。

在這里插入圖片描述

fastjson 的依賴

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.35</version>
</dependency>

Fastjson 配置類

使用 fastjson 時,對 null 的處理和 Jackson 有些不同,需要繼承 WebMvcConfigurationSupport 類,然后覆蓋 configureMessageConverters 方法。

在方法中,我們可以選擇要實現(xiàn) null 轉(zhuǎn)換的場景,代碼如下:

import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;

import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class fastJsonConfig extends WebMvcConfigurationSupport {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setDateFormat("yyyy-MM-dd");
        config.setSerializerFeatures(
                // 保留 Map 空的字段
                SerializerFeature.WriteMapNullValue,
                // 將 String 類型的 null 轉(zhuǎn)成""
                SerializerFeature.WriteNullStringAsEmpty,
                // 將 Number 類型的 null 轉(zhuǎn)成 0
                SerializerFeature.WriteNullNumberAsZero,
                // 將 List 類型的 null 轉(zhuǎn)成 []
                SerializerFeature.WriteNullListAsEmpty,
                // 將 Boolean 類型的 null 轉(zhuǎn)成 false
                SerializerFeature.WriteNullBooleanAsFalse,
                // 生成的JSON格式化
                SerializerFeature.PrettyFormat,
                // 避免循環(huán)引用
                SerializerFeature.DisableCircularReferenceDetect);

        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List<MediaType> mediaTypeList = new ArrayList<>();
        // 解決中文亂碼問題,相當于在 Controller 上的 @RequestMapping 中加了個屬性 produces = "application/json"
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(mediaTypeList);
        converters.add(converter);
    }
}

四、封裝返回的數(shù)據(jù)格式

除了要封裝數(shù)據(jù)之外,我們往往需要在返回的 JSON 中添加一些其他信息,比如返回狀態(tài)碼 Code,返回 Msg 給調(diào)用者,調(diào)用者可以根據(jù) Code 或者 Msg 進行一些邏輯判斷。

統(tǒng)一的 JSON 結(jié)構(gòu)中屬性包括數(shù)據(jù)、狀態(tài)碼、提示信息即可。

public class JsonResult<T> {

    private T data;
    private String code;
    private String msg;

    /**
     * 若沒有數(shù)據(jù)返回,默認狀態(tài)碼為 0,提示信息為“操作成功!”
     */
    public JsonResult() {
        this.code = "0";
        this.msg = "操作成功!";
    }

    /**
     * 若沒有數(shù)據(jù)返回,可以人為指定狀態(tài)碼和提示信息
     * @param code
     * @param msg
     */
    public JsonResult(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    /**
     * 有數(shù)據(jù)返回時,狀態(tài)碼為 0,默認提示信息為“操作成功!”
     * @param data
     */
    public JsonResult(T data) {
        this.data = data;
        this.code = "0";
        this.msg = "操作成功!";
    }

    /**
     * 有數(shù)據(jù)返回,狀態(tài)碼為 0,人為指定提示信息
     * @param data
     * @param msg
     */
    public JsonResult(T data, String msg) {
        this.data = data;
        this.code = "0";
        this.msg = msg;
    }
    // 省略 get 和 set 方法
}

修改 Controller 中的返回值類型,測試

@RestController
@RequestMapping("/jsonresult")
public class JsonResultController {

    @RequestMapping("/user")
    public JsonResult<User> getUser() {
        User user = new User(1, "倪升武", "123456");
        return new JsonResult<>(user);
        // {"code":"0","data":{"id":1,"password":"123456","username":"倪升武"},"msg":"操作成功!"}

    }

    @RequestMapping("/list")
    public JsonResult<List> getUserList() {
        List<User> userList = new ArrayList<>();
        User user1 = new User(1, "倪升武", "123456");
        User user2 = new User(2, "達人課", "123456");
        userList.add(user1);
        userList.add(user2);
        return new JsonResult<>(userList, "獲取用戶列表成功");
        // {"code":"0","data":[{"id":1,"password":"123456","username":"倪升武"},{"id":2,"password":"123456","username":"達人課"}],"msg":"獲取用戶列表成功"}

    }

    @RequestMapping("/map")
    public JsonResult<Map> getMap() {
        Map<String, Object> map = new HashMap<>(3);
        User user = new User(1, "倪升武", null);
        map.put("作者信息", user);
        map.put("博客地址", "http://blog.itcodai.com");
        map.put("CSDN地址", null);
        map.put("粉絲數(shù)量", 4153);
        return new JsonResult<>(map);
        // {"code":"0","data":{"作者信息":{"id":1,"password":"","username":"倪升武"},"CSDN地址":null,"粉絲數(shù)量":4153,"博客地址":"http://blog.itcodai.com"},"msg":"操作成功!"}

    }
}

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 線程狀態(tài)和等待喚醒機制和線程池的實現(xiàn)

    Java 線程狀態(tài)和等待喚醒機制和線程池的實現(xiàn)

    這篇文章主要介紹了Java 線程狀態(tài)和等待喚醒機制和線程池的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-03-03
  • springboot使用webservice發(fā)布和調(diào)用接口的實例詳解

    springboot使用webservice發(fā)布和調(diào)用接口的實例詳解

    本文介紹了如何在Springboot中使用webservice發(fā)布和調(diào)用接口,涵蓋了必要的依賴添加和代碼示例,文中提供了服務(wù)端和客戶端的實現(xiàn)方法,以及如何設(shè)置端口和服務(wù)地址,幫助讀者更好地理解和應(yīng)用Springboot結(jié)合webservice的技術(shù)
    2024-10-10
  • spring緩存cache的使用詳解

    spring緩存cache的使用詳解

    這篇文章主要介紹了spring緩存cache的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java文件上傳的多種實現(xiàn)方式

    Java文件上傳的多種實現(xiàn)方式

    文章主要介紹了文件上傳接收接口的使用方法,包括獲取文件信息、創(chuàng)建文件夾、保存文件到本地的兩種方法,以及如何使用Postman進行接口調(diào)用
    2025-01-01
  • Spring Cloud Zuul路由規(guī)則動態(tài)更新解析

    Spring Cloud Zuul路由規(guī)則動態(tài)更新解析

    這篇文章主要介紹了Spring Cloud Zuul路由規(guī)則動態(tài)更新解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2019-11-11
  • 利用Java判斷一個字符串是否包含某個字符

    利用Java判斷一個字符串是否包含某個字符

    在Java編程中,字符串操作是日常開發(fā)的常見任務(wù),涉及判斷、查找、替換等多種操作,文章介紹了如何在Java中判斷字符串是否包含某字符,提供了使用contains方法和字符數(shù)組遍歷兩種基礎(chǔ)方法,需要的朋友可以參考下
    2024-11-11
  • 使用Java發(fā)送郵件到QQ郵箱的完整指南

    使用Java發(fā)送郵件到QQ郵箱的完整指南

    在現(xiàn)代軟件開發(fā)中,郵件發(fā)送功能是一個常見的需求,無論是用戶注冊驗證、密碼重置,還是系統(tǒng)通知,郵件都是一種重要的通信方式,本文將詳細介紹如何使用Java編寫程序,實現(xiàn)發(fā)送郵件到QQ郵箱的功能,需要的朋友可以參考下
    2025-03-03
  • SpringBoot?項目中創(chuàng)建線程池

    SpringBoot?項目中創(chuàng)建線程池

    這篇文章主要介紹了SpringBoot?項目中創(chuàng)建線程池,文章基于Spring?Boot項目創(chuàng)建線程池ThreadPoolExecutor,需要的小伙伴可以參考一下
    2022-04-04
  • 關(guān)于Java 項目封裝sqlite連接池操作持久化數(shù)據(jù)的方法

    關(guān)于Java 項目封裝sqlite連接池操作持久化數(shù)據(jù)的方法

    這篇文章主要介紹了Java 項目封裝sqlite連接池操作持久化數(shù)據(jù)的方法,文中給大家介紹了sqlite的體系結(jié)構(gòu)及封裝java的sqlite連接池的詳細過程,需要的朋友可以參考下
    2021-11-11
  • SpringBoot項目配置數(shù)據(jù)庫密碼加密相關(guān)代碼

    SpringBoot項目配置數(shù)據(jù)庫密碼加密相關(guān)代碼

    這篇文章主要介紹了SpringBoot項目配置數(shù)據(jù)庫密碼加密的相關(guān)資料,本文介紹了在Springboot項目中配置數(shù)據(jù)庫連接時存在的安全問題,即用戶名和密碼以明文形式存儲,容易泄露,提出了一種簡單的加密方案,需要的朋友可以參考下
    2024-11-11

最新評論

平陆县| 盈江县| 高阳县| 桃园县| 郧西县| 大竹县| 荆门市| 昭平县| 信宜市| 绍兴县| 星子县| 尉氏县| 石河子市| 台山市| 龙南县| 宁明县| 弋阳县| 淮北市| 大安市| 马关县| 团风县| 金沙县| 崇仁县| 天柱县| 四子王旗| 美姑县| 冀州市| 平顶山市| 苗栗市| 葫芦岛市| 开化县| 喜德县| 岐山县| 朝阳区| 汾阳市| 阳原县| 齐河县| 沈丘县| 木兰县| 桦甸市| 余姚市|