天天看點

Spring接收和響應json資料

一、前言

  關于什麼是json以及基本使用技巧,為什麼使用json等等,這裡不再重複,直接進入主題

      注:服務端接收json資料還原為java對象,稱為反序列化,反之,将java對象作為響應轉換為json資料發回給用戶端,稱為序列化

二、導入json相關架構的依賴(比如jackson)

  如果使用的是spring boot架構,導入spring boot相關依賴後,就存在相關依賴,無需重複,否則會報錯;

    如果使用的是spring MVC架構,就需要手動導入相關依賴(比如Jackson),直接上代碼,添加到pom檔案中

<!-- jackson依賴 -->
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-core</artifactId>
          <version>2.7.0</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
          <version>2.7.0</version>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
          <version>2.7.0</version>
      </dependency>      

二、響應json資料

  在spring架構中,controller方法正常寫,如果需要響應json,增加@ResponseBody注解,表示目前return為資料不是視圖,如果目前controller層都需添加@ResponseBody,則可以在類名前添加@RestController 注解(@ResponseBody和@Controller合體)

三、在接受json對應的輸入參數前,加上@RequestBody注解

  此處需注意,别把@RequestBody和@ResponseBody放錯地方,觀察源代碼可知,@RequestBody隻能添加在參數前,而@ResponseBody添加在類和方法前

Spring接收和響應json資料
Spring接收和響應json資料

四、測試代碼

import com.jeat.clinic.controller.OVmodel.BookType;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Map;

/**
 * @author 
 * @class JsonTest
 * @Abstract
 * @date 2019/02/19
 */
@RestController
public class JsonTest {
    /**
     * 以實體類接收
     * @param bookType
     * @param request
     * @return
     * {"id":12,"typeName":"類型1"}
     */
    @RequestMapping(value="acceptJsonByEntity",method = RequestMethod.POST)
    public BookType acceptJsonByEntity(@RequestBody BookType bookType, HttpServletRequest request){
        System.out.println("目前http請求方式為:"+request.getMethod());

        System.out.println(bookType);
        return bookType;
    }

    /**
     * 以map方式接收
     * @param paramsMap
     * @param request
     * @return
     */
    @RequestMapping(value="acceptJsonByMap")
    public Map<String,Object> acceptJsonByMap(@RequestBody Map<String,Object> paramsMap, HttpServletRequest request){
        System.out.println("目前http請求方式為:"+request.getMethod());

        System.out.println(paramsMap);
        return paramsMap;
    }

    /**
     * 以list方式接收(以json數組形式傳遞)
     * @param bookTypeList
     * @param request
     * @return
     */
    @RequestMapping(value="acceptJsonByList")
    public List<BookType> acceptJsonByList(@RequestBody List<BookType> bookTypeList, HttpServletRequest request){
        System.out.println("目前http請求方式為:"+request.getMethod());

        System.out.println(bookTypeList);
        return bookTypeList;
    }

    /**
     * 以單獨屬性形式接收
     * @param id
     * @param name
     * @return
     */
    @RequestMapping("acceptJsonBySingleParam")
    public MultiValueMap acceptJsonByRequestParam(@RequestBody MultiValueMap params
                                          /* @RequestBody int userId,
                                           @RequestBody String userName*/
    ) {

        System.out.println(params.get("userId")+","+params.get("userName"));
        return params;
    }
}      

五、測試

  測試我們采用火狐浏覽器插件RESTClient,不會的找度娘

1、傳輸實體(類)

Spring接收和響應json資料

響應結果:

Spring接收和響應json資料

用戶端結果:

Spring接收和響應json資料

2、以map方式接收

Spring接收和響應json資料

響應結果:

Spring接收和響應json資料

用戶端結果:

Spring接收和響應json資料

 3、以list方式接收(以json數組形式傳遞)

Spring接收和響應json資料

響應結果:

Spring接收和響應json資料

用戶端結果:

Spring接收和響應json資料

 附:RESTClient添加頭字段操作:

Spring接收和響應json資料
Spring接收和響應json資料
Spring接收和響應json資料