Spring MVC之Json處理

Json作爲客戶端和服務器端數據交換的一種很重要的數據交換格式,應用非常廣泛,那麼如何在Spring MVC中處理Json(接收,轉化,響應…)

Json

Spring MVC默認使用的Json解決方案選擇的是Jackson,所以只需要導入Jackson的依賴就可以使用了

導入依賴

        <!-- Jackson -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.4.2</version>
        </dependency>

使用@ResponseBody

這個註解的作用是將返回值自動轉爲json並返回給客戶端

我們假定在處理業務時需要返回給客戶端一個Employee的對象

    @RequestMapping("test1")
    @ResponseBody   //這個註解的作用是將返回值自動轉爲json並返回給客戶端
    public Employee test1(){
        System.out.println("test1");
        Employee employee = new Employee(1,"leiyu",true);
        return employee;
    }
  • 注意方法返回值,renturn直接返回的是我們獲取到的employee對象,,由SpringMVC自動爲我們轉化爲json,需要添加@ResponseBody註解

小總結:當以後我們需要用到json數據時,只需要添加這個註解,並直接返回

@ResponseBody註解適合所有的對象類型,不論是實體,還是集合…等

    @RequestMapping("test2")
    @ResponseBody
    public List<Employee> test2(){
        System.out.println("test2  json轉化複雜對象,或者說嵌套對象");
        Employee employee = new Employee(1,"leiyu",true);
        Employee employee1 = new Employee(1,"小白",false);
        List<Employee> employeeList = Arrays.asList(employee,employee1);
        return employeeList;
    }

特例:@ResponseBody對字符串無轉化效果

  • 只有當返回值不是字符串時纔會幫我們轉化
  • 如果是字符串類型,那麼就會直接輸出字符串的內容
  • 觀察這個示例,發現加了@ResponseBody註解之後,使用return返回的不再是一個頁面,而是將字符直接響應給客戶端
    @RequestMapping("test3")
    @ResponseBody
    public String test3(){
        System.out.println("註解對原本就是字符串的無轉化,直接輸出");
        return "ok";//因爲加了註解,這裏不再轉發到頁面而是返回一個json字符串,而這個又是字符串類型,因爲直接輸出字符
    }
    //如果字符串是中文,那麼要要設置字符集,不然會中文亂碼
    @RequestMapping(value = "test4",produces = "text/html;charset=utf-8")
    @ResponseBody
    public String test4(){
        System.out.println("註解對原本就是字符串的無轉化,直接輸出");
        return "ok";//因爲加了註解,這裏不再轉發到頁面而是返回一個json字符串,而這個又是字符串類型,因爲直接輸出
    }
  • 如果需要響應的字符串是中文,那麼需要設置字符集 produces="text/html;charset=utf-8"
  • 細心的讀者發現我們之前在封裝實體對象或者集合等類型時,雖然也有中文,但是不需要設置字符集,是因爲在Jackson中已經爲我們封裝好了關於對象轉化爲json的字符集,而在字符串是直接響應,不再將字符串轉化爲json,也就沒有封裝字符集,需要我們自己封裝.

@RestController

@RestController中封裝了@Controller註解,在類的上寫@RestController一方面表示這個類是一個控制器類,另一方面,它會爲該控制器中的所有handler都自動封裝一個@ResponseBody註解,就意味着在該控制器中的每個handler都需要返回一個json格式的數據

在@RestController中封裝了@Controller
image-20200625082926858
@RequestMapping("employee")
@RestController
public class EmployeeController {
    @RequestMapping("test1")
    //@ResponseBody   因爲有了@RestController註解,在handler中就不需要在寫這個註解
    public Employee test1(){
        System.out.println("test1");
        Employee employee = new Employee(1,"leiyu",true);
        return employee;
    }
}

@RequestBody

使用@RequestBody,接收Json參數

定義Handler

public class User {
    private Integer id;
    private String name;
    private Boolean gender;
    private Date birthday;
}

定義去值方法


    @RequestMapping("test2")
    @ResponseBody
    public String test2(@RequestBody User user){
        System.out.println(user);
        return "ok";

    }

Ajax發送Json請求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Json接收響應</title>
    <script src="${pageContext.request.contextPath}/js/jquery-1.10.2.js"></script>
</head>
<body>


    <input type="button" value="ajax" οnclick="send_json();">
    <script>
        function send_json() {
            var  user = {id:1,name:"雷雨"};
            var userJson = JSON.stringify(user);
            $.ajax({
                url:"${pageContext.request.contextPath}json/test2",
                type:"post",
                data:userJson,
                contentType:"application/json",
                success:function (ret) {
                    alert(ret);
                }
            })
        }
    </script>
</body>
</html>

Jackson常用註解

日期轉化

在日期轉json時,默認使用的是日期的毫秒數

可閱讀性不強,因爲需要使用到日期的格式化

使用註解@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

  • pattern的參數的時期格式化的格式
  • timezone表示的是日期的時區,我們在東八區因爲加8
public class User {
    private Integer id;
    private String name;
    private Boolean gender;
    @JsonFormat(pattern = "yyyy-MMM-dd HH:mm:ss",timezone = "GMT+8")
    private Date birthday;
    ...
    get/set
}

屬性忽略

@JsonIgnore

在實體類的屬性上加這個註解,那麼會在生成Json時忽略該屬性

屬性名修改

@JsonProperty(“new_name”)

在實體類的屬性上加這個註解,那麼會在生成Json時使用新的屬性名作爲Json格式的屬性名

null和empty屬性排除

Jackson默認輸出null值的屬性,如果不需要,可以排除

  • @JsonInclude(JsonInlude.Include.NON_NULL):表示null值 屬性不輸出
  • @JsonInclude(JsonInlude.Include.NON_EMPTY):empty屬性不輸出(空串,長度爲0的集合,null值)

自定義序列化

@JsonSerialize(using= Myserializer.class) ,使用Myserializer輸出某屬性

Fastjson

如果不想使用Jackson,那麼也可以使用FastJson,由於FastJson不是MVC的默認依賴方案,因此需要自己額外帶入依賴和安裝

導入依賴

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

安裝FastJson

    <mvc:annotation-driven>
        <!--安裝FstJson,轉換器 -->
        <mvc:message-converters>
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>application/json</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

使用

@ResponseBody @RequestBody @RestController使用方法不變

常用註解

  • 日期格式化:@FSONField(format=“yyyy/MM/dd”)
  • 屬性名修改: @JSONField(name=“birth”)
  • 屬性忽略: @JSONField(serialize = false)
  • 包含null值:@JSONField(serializeFeatures = SerillizeFeature.WriteMapNullValue) 默認忽略所有null值,有此註解會輸出null
    • @JSONField(serialzeFeatures=SerializeFeature.WriteNullStringAsEmpty)
  • 自定義序列化:@JSONField(serializeUsing = MySerializer2.class)
    • MySerializer2是我們寫的自定義的序列化的類

我是雷雨,一個普本科的學生,主要專注於Java後端和大數據開發

如果這篇文章有幫助到你,希望你給我一個大大的贊
如果有什麼問題,希望你能留言和我一起研究,學習靠自覺,分享靠自願

轉載註明出處
https://blog.csdn.net/qq_40742223

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章