1. 程式人生 > 實用技巧 >(六) - json處理

(六) - json處理

springMVC預設的 Json 解決方案是 Jackson, 所以只需要匯入 Jackson 的 jar, 即可使用.

匯入Jackson的依賴:

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

jackson 可以通過以下三個註解來實現對 json 資料的處理:

  • @ResponseBody
  • @RestController
  • @RequestBody

一. @ResponseBody

這個註解的意思是: 把這個handler的返回值轉成json返回給客戶端, 所以此handler不會跳轉到相關JSP頁面, 如果返回的是字串, 則不會轉成Json, 直接返回

handler 程式碼:

@Controller
@RequestMapping("/jackson")
public class TestJackson { @RequestMapping("/test1") //這個註解的意思是: 把這個handler的返回值轉成json返回給客戶端, 所以此handler不會跳轉到相關JSP頁面, 如果返回的是字串, 則不會轉成Json, 直接返回 @ResponseBody public JacksonData test1(){ System.out.println("test1"); JacksonData jacksonData = new JacksonData("name", "張三");
return jacksonData; } }

JacksonData.java 程式碼:

public class JacksonData {
    private String jacksonName;
    private String jacksonValue;

    @Override
    public String toString() {
        return "JacksonData{" +
                "jacksonName='" + jacksonName + '\'' +
                ", jacksonValue='" + jacksonValue + '\'' +
                '}';
    }

    public JacksonData(String jacksonName, String jacksonValue) {
        this.jacksonName = jacksonName;
        this.jacksonValue = jacksonValue;
    }

    public String getJacksonName() {
        return jacksonName;
    }

    public String getJacksonValue() {
        return jacksonValue;
    }

    public void setJacksonName(String jacksonName) {
        this.jacksonName = jacksonName;
    }

    public void setJacksonValue(String jacksonValue) {
        this.jacksonValue = jacksonValue;
    }
}

訪問及返回:

在@ResponseBody註解下, 若return字串, 則直接將此字串返回給客戶端:

*注意: 此時由於未呼叫springMVC操作轉json, 直接返回中文會有亂碼問題, 需要我們設定編碼格式, 設定方式為在@RequestMapping註解的引數中指定value = "/test2", produces = "text/html;charset=utf-8"

@Controller
@RequestMapping("/jackson")
public class TestJackson {

    @RequestMapping(value = "/test2", produces = "text/html;charset=utf-8")
    @ResponseBody
    public String test2() {
        System.out.println("test2");
        //在@ResponseBody註解下, 若return字串, 則直接將此字串返回給客戶端
        return "伺服器資料";
    }

}

訪問及返回:

二.@RestController

當我們在一個Controller中的所有handler前都要加@ResponseBody註解時, 我們可以在這個Controller前面加上@RestController註解, 這樣, 其下的所有@ResponseBody註解都不需要加了, 同時,@RestController是一個複合註解, 其中集成了@Controller, 所以@Controller註解也可以省略, 如下示例:

@RequestMapping("/jackson")
@RestController
public class TestJackson {

    @RequestMapping("/test1")
    public JacksonData test1(){
        System.out.println("test1");
        JacksonData jacksonData = new JacksonData("name", "張三");
        return jacksonData;
    }

    @RequestMapping(value = "/test2", produces = "text/html;charset=utf-8")
    public String test2() {
        System.out.println("test2");
        return "伺服器資料";
    }

}

訪問及返回:

三.@RequestBody

@RequestBody 註解可以用來接收請求的 json 資料. 用法如下:

@RequestMapping("/jackson")
@RestController
public class TestJackson {

    @RequestMapping(value = "/test3", method = {RequestMethod.POST})
    @ResponseBody
    //@RequestBody註解會讓springMVC接收前端傳過來的json資料並轉成JacksonData物件賦值給jacksonData
    public String test3(@RequestBody JacksonData jacksonData){
        System.out.println(jacksonData);
        return "hello";
    }

}

@RequestBody 只能接收post的資料, 建立testJackson.jsp:

<html>
<head>
    <title>Title</title>
    <script src="js/jquery-2.1.1.js"></script>
</head>
<body>
    <input id="i1" type="button" value="ajax" onclick="send_json1();">

<script> function send_json1() { var data = {jacksonName: "Ryan", jacksonValue: "good"}; var dataJson = JSON.stringify(data); $.ajax({ // url: "localhost:8080/jackson/test3", url: "${pageContext.request.contextPath}/jackson/test3", type: "post", data: dataJson, dataType:"json", contentType: "application/json", success: function (res) { alert(res); } }) } </script> </body> </html>

先直接訪問testJackson.jsp, 再通過這個頁面以 Ajax 將資料以post的方式提交到 servlet, 正常情況下伺服器將列印提交的資料.

但是按這樣的寫法, 我們可以發現, 在訪問到 testJackson.jsp, 呼叫Ajax之後, 服務端報錯 500:

如果是使用谷歌瀏覽器, 還會自動跳轉到 Sources 頁面並表示 jQuery 的xhr.send( options.hasContent && options.data || null ); 這行程式碼有問題, 我不是很懂谷歌報這個錯是什麼意思...